欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java集合類之Map篇

 更新時(shí)間:2022年07月26日 16:59:44   作者:世界盡頭與你  
這篇文章主要為大家詳細(xì)介紹一下Java集合類中Map的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下

1.Map接口介紹

Map用于保存具有映射關(guān)系的數(shù)據(jù):Key - Value

對(duì)于Set,底層其實(shí)依然是一個(gè)Map,但是Set選擇不使用Value,也就是Set的Value值始終是一個(gè)常量

Map中的Key和Value可以是任何類型的數(shù)據(jù),會(huì)封裝到HashMap$Node對(duì)象中

Map中的Key不能重復(fù),但是Value可以重復(fù),當(dāng)有相同的Key時(shí),等價(jià)與替換操作

2.Map接口分析

存放Map鍵值對(duì)是在HashMap$Node中

tab[i] = newNode(hash, key, value, null);

--

Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
    return new Node<>(hash, key, value, next);
}

那么這個(gè)Node節(jié)點(diǎn)的數(shù)據(jù)類型是什么樣的呢?

我們來(lái)看一下源代碼:(其還實(shí)現(xiàn)了Entry接口)

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;  // 存放hash值
    final K key;  // 存放key值
    V value;  // 存放Value值
    Node<K,V> next;  // 存放下一個(gè)個(gè)節(jié)點(diǎn),以形成鏈表結(jié)構(gòu)
}

k-v為了方便程序員的遍歷,還會(huì)創(chuàng)建一個(gè)EntrySet集合,該集合存放的元素類型是Entry,而一個(gè)Entry對(duì)象含有k,v,但是本質(zhì)上這里的k-v值還是指向一個(gè)Node節(jié)點(diǎn)中的數(shù)據(jù),也就是這里的k-v存放的依然是地址數(shù)據(jù)

// k-v存在有EntrySet的一個(gè)指向
Set set = map.entrySet();
System.out.println(set.getClass());

輸出:

class java.util.HashMap$EntrySet

那么,這個(gè)方便程序員遍歷的特性是如何體現(xiàn)的呢?

原因是Map.Entry提供了兩個(gè)非常重要的方法:K getKey(); V getValue();。所以我們可以通過(guò)如下的方式進(jìn)行遍歷Map:

Set set = map.entrySet();
System.out.println(set.getClass());
for (Object obj : set) {
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

那怎么證明Entry里面存放的k-v只是地址的指向呢?很簡(jiǎn)單

通過(guò)debug,我們先來(lái)看一下Map中存放的數(shù)據(jù),其no2這個(gè)鍵的地址是@727

再來(lái)看一下set中no2鍵的地址,一模一樣:

3.Map接口方法

代碼示例:

Map map = new HashMap();
// 添加鍵值對(duì)
map.put("no1","dahe");
map.put("no2","zhangsan");
// Key重復(fù)會(huì)進(jìn)行替換
map.put("no1","lisi");
System.out.println(map);

// 根據(jù)鍵刪除映射關(guān)系
map.remove("no1");
System.out.println(map);
// 根據(jù)key得到值
Object no2 = map.get("no2");
System.out.println(no2);
// 獲取鍵值對(duì)數(shù)量
System.out.println(map.size());
// 判空
System.out.println(map.isEmpty());
// 清空
// map.clear();
// 查找鍵是否存在
System.out.println(map.containsKey("ok"));

4.Map遍歷方式

第一式:取出所有的key,通過(guò)key取出對(duì)應(yīng)的value

// 取出所有的key,通過(guò)key取出對(duì)應(yīng)的value
Set keySet = map.keySet();
for (Object o : keySet) {
    System.out.println(o);
    System.out.println(map.get(o));
}

第二式:把所有的value值取出

// 把所有的value值取出
Collection values = map.values();
for (Object value : values) {
    System.out.println(value);
}

第三式:通過(guò)EntrySet來(lái)獲取 k-v

// 通過(guò)EntrySet來(lái)獲取 k-v
Set entrySet1 = map.entrySet();
for (Object o : entrySet1) {
    // 將entry 轉(zhuǎn)成 Map.Entry
    Map.Entry m = (Map.Entry) o;
    System.out.println(m.getKey());
    System.out.println(m.getValue());
}

到此這篇關(guān)于詳解Java集合類之Map篇的文章就介紹到這了,更多相關(guān)Java集合類Map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring如何處理表單提交

    Spring如何處理表單提交

    這篇文章主要介紹了Spring如何處理表單提交,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-10-10
  • spring?jpa?審計(jì)功能自定義填充字段方式

    spring?jpa?審計(jì)功能自定義填充字段方式

    這篇文章主要介紹了spring?jpa審計(jì)功能自定義填充字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 字符串desede 3des加密示例分享

    字符串desede 3des加密示例分享

    這篇文章主要介紹了字符串desede 3des加密示例,大家參考使用吧
    2014-01-01
  • Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解

    Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解

    這篇文章主要介紹了Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解,代理模式是23種設(shè)計(jì)模式的一種,他是指一個(gè)對(duì)象A通過(guò)持有另一個(gè)對(duì)象B,可以具有B同樣的行為的模式,為了對(duì)外開(kāi)放協(xié)議,B往往實(shí)現(xiàn)了一個(gè)接口,A也會(huì)去實(shí)現(xiàn)接口,需要的朋友可以參考下
    2023-11-11
  • 5分鐘教你使用java搞定網(wǎng)站登錄驗(yàn)證碼

    5分鐘教你使用java搞定網(wǎng)站登錄驗(yàn)證碼

    這篇文章主要為大家介紹了使用java搞定網(wǎng)站登錄驗(yàn)證碼的快速實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作

    java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作

    這篇文章主要為大家詳細(xì)介紹了java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼)

    SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼)

    這篇文章主要介紹了SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot使用JTA實(shí)現(xiàn)對(duì)多數(shù)據(jù)源的事務(wù)管理

    SpringBoot使用JTA實(shí)現(xiàn)對(duì)多數(shù)據(jù)源的事務(wù)管理

    了解事務(wù)的都知道,在我們?nèi)粘i_(kāi)發(fā)中單單靠事務(wù)管理就可以解決絕大多數(shù)問(wèn)題了,但是為啥還要提出JTA這個(gè)玩意呢,到底JTA是什么呢?他又是具體來(lái)解決啥問(wèn)題的呢?本文小編就給大家介紹一下如何在Spring Boot中使用JTA實(shí)現(xiàn)對(duì)多數(shù)據(jù)源的事務(wù)管理
    2023-11-11
  • Java繼承Thread類創(chuàng)建線程類示例

    Java繼承Thread類創(chuàng)建線程類示例

    這篇文章主要介紹了Java繼承Thread類創(chuàng)建線程類,結(jié)合實(shí)例形式分析了java線程操作相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • Java?常見(jiàn)排序算法代碼分享

    Java?常見(jiàn)排序算法代碼分享

    這篇文章主要介紹了Java?常見(jiàn)排序算法代碼分享,文章通過(guò)分享詳細(xì)的代碼總結(jié)文章內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03

最新評(píng)論