溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java集合類之Map怎么使用

發(fā)布時間:2022-07-27 09:30:55 來源:億速云 閱讀:107 作者:iii 欄目:開發(fā)技術(shù)

這篇“Java集合類之Map怎么使用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java集合類之Map怎么使用”文章吧。

1.Map接口介紹

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

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

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

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

2.Map接口分析

存放Map鍵值對是在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);
}

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

我們來看一下源代碼:(其還實(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;  // 存放下一個個節(jié)點(diǎn),以形成鏈表結(jié)構(gòu)
}

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

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

輸出:

class java.util.HashMap$EntrySet

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

原因是Map.Entry提供了兩個非常重要的方法:K getKey(); V getValue();。所以我們可以通過如下的方式進(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只是地址的指向呢?很簡單

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

Java集合類之Map怎么使用

再來看一下set中no2鍵的地址,一模一樣:

Java集合類之Map怎么使用

3.Map接口方法

代碼示例:

Map map = new HashMap();
// 添加鍵值對
map.put("no1","dahe");
map.put("no2","zhangsan");
// Key重復(fù)會進(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);
// 獲取鍵值對數(shù)量
System.out.println(map.size());
// 判空
System.out.println(map.isEmpty());
// 清空
// map.clear();
// 查找鍵是否存在
System.out.println(map.containsKey("ok"));

4.Map遍歷方式

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

// 取出所有的key,通過key取出對應(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);
}

第三式:通過EntrySet來獲取 k-v

// 通過EntrySet來獲取 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怎么使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI