最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

java雙例集合HashMap類(lèi)

2022-07-27 15:56 作者:虛云幻仙  | 我要投稿

/**
* Map雙例集合 存儲(chǔ)格式為KV鍵值對(duì) K(key)不可重復(fù) ?V(value)可重復(fù) Map接口常用實(shí)現(xiàn)類(lèi)HashMap和TreeMap
* value為要存儲(chǔ)的元素
*/

public class TestHashMap {
? ?public static void main(String[] args) {
? ? ? ?Map<String,Integer> hm = new HashMap<>();
? ? ? ?//泛型字符有K/V兩個(gè) 需要分別設(shè)定 設(shè)定類(lèi)型可重復(fù) 第一個(gè)泛型K代表key 第二個(gè)泛型V代表value
? ? ? ?Integer oldscore = hm.put("wang",59);
? ? ? ?//Map接口添加元素的方法.put 將KV對(duì)傳參 返回類(lèi)型V 添加元素時(shí)會(huì)對(duì)key進(jìn)行判斷 如果Map內(nèi)沒(méi)有該key 則存儲(chǔ)該KV對(duì)并返回null
? ? ? ?System.out.println(oldscore);
? ? ? ?//結(jié)果null
? ? ? ?oldscore = hm.put("wang",61);
? ? ? ?//如果Map內(nèi)已經(jīng)有該key 則將新的value覆蓋掉原來(lái)的 ?將原來(lái)的value返回 Map內(nèi)不生成新的KV對(duì)
? ? ? ?System.out.println(oldscore);
? ? ? ?//結(jié)果59 新的成績(jī)61將59覆蓋
? ? ? ?System.out.println(hm);
? ? ? ?//結(jié)果{wang=61} 只有一個(gè)KV對(duì) wang的成績(jī)被更改為61
? ? ? ?System.out.println(hm.get("wang"));
? ? ? ?//.get(K) 返回對(duì)應(yīng)的value 結(jié)果61
? ? ? ?System.out.println(hm.get("aaaaa"));
? ? ? ?//集合中沒(méi)有找到相同的key時(shí)會(huì)返回null
? ? ? ?hm.put("zhao",80);
? ? ? ?for (String key:hm.keySet()){
? ? ? ? ? ?//.keySet()返回包含所有key的Set集合 通過(guò)for-each遍歷key
? ? ? ? ? ?System.out.println(hm.get(key));
? ? ? ? ? ?//用每個(gè)key傳參進(jìn).get(K)方法拿到value 結(jié)果61 80
? ? ? ?}
? ? ? ?Set<String> keys = hm.keySet();
? ? ? ?//返回key的Set集合 因?yàn)閗ey泛型設(shè)定為String 引用類(lèi)型的Set泛型也要設(shè)定為String

? ? ? ?Set<Map.Entry<String,Integer>> entries = hm.entrySet();
? ? ? ?//Map接口的.entrySet()返回包含所有Map.Entry對(duì)象的集合 ?Entry<K,V>接口為Map<K,V>接口的內(nèi)部接口 通過(guò)Map.調(diào)用 ?entry條目
? ? ? ?//集合內(nèi)每一個(gè)Entry<K,V>對(duì)象表示一個(gè)KV對(duì) 集合的存儲(chǔ)類(lèi)型為Entry Entry的KV類(lèi)型同Map中的設(shè)定
? ? ? ?//所以集合的泛型Set<Map.Entry> ?為通過(guò)Map調(diào)用的子接口Entry類(lèi)型 ? 而Entry的泛型 Entry<String,Integer> 和調(diào)用.entrySet()的Map容器對(duì)象保持一致
? ? ? ?//合起來(lái)為Set<Map.Entry<String,Integer>> 引用類(lèi)型
? ? ? ?//如同Map hm = new HashMap一樣 ?Entry接口同樣為編譯類(lèi)型 實(shí)際存儲(chǔ)為Entry的實(shí)現(xiàn)類(lèi)

? ? ? ?for (Map.Entry<String,Integer> entry:entries){
? ? ? ? ? ?//Set<Map.Entry<String,Integer>>集合中的元素為Map.Entry<String,Integer> for-each需要設(shè)定同類(lèi)型的引用變量來(lái)遍歷
? ? ? ? ? ?System.out.println(entry.getKey());
? ? ? ? ? ?System.out.println(entry.getValue());
? ? ? ? ? ?//通過(guò).getKey().getValue()調(diào)用每個(gè)entry內(nèi)的key和value
? ? ? ? ? ?System.out.println(entry);
? ? ? ? ? ?//直接打印entry結(jié)果為wang=61
? ? ? ?}
? ? ? ?System.out.println(hm.entrySet());
? ? ? ?//直接打印entry集合返回?cái)?shù)組 結(jié)果為[wang=61, zhao=80]
? ? ? ?System.out.println(hm);
? ? ? ?//結(jié)果為{wang=61, zhao=80}

? ? ? ?Map<String,Integer> hm2 = new HashMap<>();
? ? ? ?hm2.put("zhao",40);
? ? ? ?hm2.put("sun",99);
? ? ? ?hm.putAll(hm2);
? ? ? ?//.putAll(Map m) 并集 將m集合中的元素放進(jìn)this集合中 如果this中已有部分key 會(huì)被m中的KV覆蓋 無(wú)返回值
? ? ? ?System.out.println(hm);
? ? ? ?//結(jié)果為{wang=61, zhao=40, sun=99} hm2的zhao=40覆蓋了hm的zhao=80

? ? ? ?Integer value = hm.remove("wang");
? ? ? ?//.remove(K key) 傳參key 刪除對(duì)應(yīng)的KV對(duì) 返回被刪除的value
? ? ? ?for (String key :
? ? ? ? ? ? ? ?hm.keySet()) {
? ? ? ? ? ?System.out.print(key+"="+hm.get(key)+",");
? ? ? ?}
? ? ? ?//結(jié)果為zhao=40,sun=99,
? ? ? ?System.out.println(value);
? ? ? ?//結(jié)果為61
? ? ? ?System.out.println(hm.containsKey("wang"));
? ? ? ?//.containsKey(K key)查詢集合中是否包含key 返回類(lèi)型boolean 因?yàn)閣ang已經(jīng)被remove 集合中不存在wang返回false
? ? ? ?System.out.println(hm.containsValue(99));
? ? ? ?//.containsValue(V value)查詢集合中是否包含value 返回類(lèi)型boolean 結(jié)果為true
? ?}
}
/* ctrl+左鍵查看HashMap源碼
public class HashMap<K,V> extends AbstractMap<K,V>
? ?implements Map<K,V>, Cloneable, Serializable {
? ?//泛型類(lèi)HashMap<K,V>實(shí)現(xiàn)泛型接口Map<K,V>
? ?static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
? ?//initial初始的 默認(rèn)初始容量 1左位移4為1*2^4=16 HashMap集合的哈希表數(shù)組的初始長(zhǎng)度為16 數(shù)組的長(zhǎng)度必須為2的n次冪
? ?//HashMap延遲初始化 當(dāng)new HashMap()無(wú)參時(shí) 哈希表數(shù)組為{} 初次.put()添加結(jié)點(diǎn)時(shí)會(huì)初始化長(zhǎng)度

? ?static final int MAXIMUM_CAPACITY = 1 << 30;
? ?//maximum最大 哈希表數(shù)組的最大長(zhǎng)度為2^30 int類(lèi)型的取值范圍為-2^31到2^31-1
? ?static final float DEFAULT_LOAD_FACTOR = 0.75f;
? ?//load負(fù)載 factor因子 0.75默認(rèn)double類(lèi)型 加f轉(zhuǎn)為float類(lèi)型 當(dāng)容器的占用率達(dá)到75%時(shí)會(huì)對(duì)哈希表數(shù)組進(jìn)行擴(kuò)容
? ?static final int TREEIFY_THRESHOLD = 8;
? ?//tree指紅黑樹(shù) threshold閾 當(dāng)哈希桶/單向鏈表的size達(dá)到8 并且哈希表數(shù)組的長(zhǎng)度達(dá)到64時(shí) 會(huì)將哈希桶從鏈表轉(zhuǎn)變?yōu)榧t黑樹(shù)
? ?static final int UNTREEIFY_THRESHOLD = 6;
? ?//當(dāng)紅黑樹(shù)結(jié)點(diǎn)的size降到6時(shí) 會(huì)將紅黑樹(shù)變回單向鏈表
? ?static final int MIN_TREEIFY_CAPACITY = 64;
? ?//只有當(dāng)哈希表數(shù)組的長(zhǎng)度達(dá)到64之后 單向鏈表的size達(dá)到8才會(huì)轉(zhuǎn)變?yōu)榧t黑樹(shù)

? ?static class Node<K,V> implements Map.Entry<K,V> {
? ?//靜態(tài)內(nèi)部類(lèi) node結(jié)點(diǎn) 實(shí)現(xiàn)Map.Entry 當(dāng)HashMap集合調(diào)用.entrySet()返回的Map.Entry集合 Map.Entry為編譯類(lèi)型 運(yùn)行時(shí)類(lèi)型為HashMap.Node<K,V>
? ?//即實(shí)際返回的是結(jié)點(diǎn)的集合 Node為單向鏈表的結(jié)點(diǎn)

? ? ? ?final int hash;
? ? ? ?//hash值決定結(jié)點(diǎn)存放在哈希表的哪個(gè)位置
? ? ? ?final K key;
? ? ? ?//集合中存儲(chǔ)的每一對(duì)KV的key實(shí)際存放在node結(jié)點(diǎn)的key中
? ? ? ?V value;
? ? ? ?//value存放KV對(duì)的元素 是真正要存放的對(duì)象
? ? ? ?Node<K,V> next;
? ? ? ?//直接后繼結(jié)點(diǎn) 單向鏈表沒(méi)有直接前驅(qū)結(jié)點(diǎn)指針prev 鏈表表尾結(jié)點(diǎn)的next=null
? ? ? ?public final K getKey() ? ? ? ?{ return key; }
? ? ? ?public final V getValue() ? ? ?{ return value; }
? ? ? ?//Node實(shí)現(xiàn)Map.Entry接口的getKey()和getValue()方法 實(shí)際調(diào)用每個(gè)entry.getKey()時(shí)即調(diào)用Node重寫(xiě)的方法

? ?//回到HashMap類(lèi)
? ?transient Node<K,V>[] table;
? ?//table即哈希表數(shù)組 數(shù)組類(lèi)型為結(jié)點(diǎn) 在表中存放的是單向鏈表的表頭結(jié)點(diǎn) 同index的結(jié)點(diǎn)通過(guò).next單向鏈接 當(dāng)添加結(jié)點(diǎn)時(shí)會(huì)將新結(jié)點(diǎn)鏈到表尾
? ?//當(dāng)刪除結(jié)點(diǎn)時(shí)會(huì)將其前驅(qū)結(jié)點(diǎn).next變更為刪除結(jié)點(diǎn)的后繼結(jié)點(diǎn) 跳過(guò)要?jiǎng)h除的結(jié)點(diǎn)完成刪除 刪除表頭結(jié)點(diǎn)會(huì)將表頭變更為表頭結(jié)點(diǎn)的后繼結(jié)點(diǎn)


? ?static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
? ?//樹(shù)結(jié)點(diǎn) 用于紅黑樹(shù)的結(jié)點(diǎn) 父類(lèi)的父類(lèi)是HashMap.Node類(lèi) 通過(guò)繼承Node類(lèi)實(shí)現(xiàn)鏈表結(jié)點(diǎn)和樹(shù)結(jié)點(diǎn)的轉(zhuǎn)換
? ? ? ?TreeNode<K,V> parent;
? ? ? ?//樹(shù)結(jié)點(diǎn)的父結(jié)點(diǎn)
? ? ? ?TreeNode<K,V> left;
? ? ? ?//樹(shù)結(jié)點(diǎn)的左子樹(shù)結(jié)點(diǎn)
? ? ? ?TreeNode<K,V> right;
? ? ? ?//右子樹(shù)結(jié)點(diǎn)
? ? ? ?TreeNode<K,V> prev; ? ?// needed to unlink next upon deletion
? ? ? ?boolean red;
? ? ? ?//boolean類(lèi)型 用于表示樹(shù)結(jié)點(diǎn)為紅色還是黑色 boolean只占1bit
? ? ? ?TreeNode(int hash, K key, V val, Node<K,V> next) {
? ? ? ? ? ?super(hash, key, val, next);
? ? ? ?}

? ?transient int size;
? ?//集合中結(jié)點(diǎn)的總數(shù)
? ?int threshold;
? ?//閾值,為數(shù)組容量capacity*負(fù)載因子load factor的值,當(dāng)size達(dá)到閾值時(shí)會(huì)對(duì)數(shù)組進(jìn)行擴(kuò)容

? ?public HashMap() {
? ? ? ?this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
? ?}
? ?//無(wú)參構(gòu)造器,new HashMap<>()哈希表table沒(méi)有初始化容量,默認(rèn)初始化為null
*/

java雙例集合HashMap類(lèi)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
绩溪县| 富蕴县| 克拉玛依市| 双柏县| 独山县| 康乐县| 沈阳市| 岳普湖县| 汉寿县| 合阳县| 利川市| 龙川县| 南丹县| 简阳市| 睢宁县| 柘荣县| 通化县| 扎鲁特旗| 绿春县| 盐源县| 陆河县| 淅川县| 海原县| 巴林左旗| 武隆县| 玛曲县| 股票| 邳州市| 赤城县| 泸定县| 柳河县| 永定县| 石台县| 清原| 云和县| 呈贡县| 广宗县| 谢通门县| 弋阳县| 江川县| 邵阳市|