色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java Map接口及其實(shí)現(xiàn)類(lèi)原理解析

瀏覽:94日期:2022-09-04 11:13:56

Map接口

Map提供了一種映射關(guān)系,其中的元素是以鍵值對(duì)(key-value)的形式存儲(chǔ)的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;

Map中的鍵值對(duì)以Entry類(lèi)型的對(duì)象實(shí)例形式存在;建(key值)不可重復(fù),value值可以重復(fù),一個(gè)value值可以和很多key值形成對(duì)應(yīng)關(guān)系,每個(gè)建最多只能映射到一個(gè)值。

Map支持泛型,形式如:Map<K,V>

Map中使用put(K key,V value)方法添加

Map接口中定義的常用方法

具體使用在實(shí)現(xiàn)類(lèi)中討論

int size();//獲取Map集合大小(即元素?cái)?shù)量)boolean isEmpty();//判斷是否為空boolean containsKey(Object key);//判斷是否包含某個(gè)鍵boolean containsValue(Object value);//判斷是否包含某個(gè)值V get(Object key);//獲取某個(gè)鍵對(duì)應(yīng)的值V put(K key, V value);//添加鍵值對(duì)(K,V)V remove(Object key);//移除某個(gè)鍵對(duì)應(yīng)的鍵值對(duì)void putAll(Map<? extends K, ? extends V> m);//添加另一個(gè)Map集合void clear();//清空所有鍵值對(duì)Set<K> keySet();//獲取鍵的集合Collection<V> values();//獲取值的集合Set<Map.Entry<K, V>> entrySet();//獲取鍵值對(duì)實(shí)體的集合interface Entry<K,V>//Map中的內(nèi)部接口

HashMap

基于哈希表的 Map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類(lèi)與 Hashtable 大致相同。)除實(shí)現(xiàn)了Map接口外還實(shí)現(xiàn)了Cloneable,Serializable,繼承了AbstractMap抽象類(lèi)

此類(lèi)不保證映射的順序,特別是它不保證該順序恒久不變。

特點(diǎn):

鍵無(wú)序,唯一,類(lèi)似于Set集合 值有序,可重復(fù),類(lèi)似于List 底層數(shù)據(jù)結(jié)構(gòu)是哈希表,保證鍵唯一

允許鍵為null,值為null

// HashMap<String, Student> hm = new HashMap<String, Student>();// hm.put('2018050401', new Student('2018050401', '張三', 18, 80.0));// hm.put('2018050402', new Student('2018050402', '李四', 18, 80.0));// hm.put('2018050403', new Student('2018050403', '李四', 18, 80.0));// hm.put('2018050404', new Student('2018050404', '王五', 18, 80.0));// hm.put('2018050404', new Student('2018050404', '王五', 18, 80.0));// // // 方式一: 通過(guò)鍵找值// Set<String> keys = hm.keySet();// for (String key : keys) {// Student s = hm.get(key);// System.out.println(key + '|' + s.getId() + '|' + s.getName() + '|' + s.getAge() + '|' + s.getScore());// } HashMap<Student, String> hm = new HashMap<Student, String>(); hm.put(new Student('2018050401', '張三', 18, 80.0),'2018050401'); hm.put(new Student('2018050402', '李四', 18, 80.0),'2018050402'); hm.put(new Student('2018050403', '李四', 18, 80.0), '2018050403'); hm.put(new Student('2018050404', '王五', 18, 80.0), '2018050404'); hm.put(new Student('2018050404', '王五', 18, 80.0), '2018050404');// 方式二: 通過(guò)鍵值對(duì)對(duì)象找鍵找值 Set<Entry<Student, String>> keyValues = hm.entrySet(); for (Entry<Student, String> keyValue : keyValues) { Student s = keyValue.getKey(); String value = keyValue.getValue(); System.out.println(s.getId() + '|' + s.getName() + '|' + s.getAge() + '|' + s.getScore() + '=' + value); }

LinkedHashMap

Map 接口的哈希表和鏈表實(shí)現(xiàn),具有可預(yù)知的迭代順序

特點(diǎn):

鍵有序,唯一, 值有序,可重復(fù),類(lèi)似于List

底層數(shù)據(jù)結(jié)構(gòu)是哈希表和鏈表,哈希表保證鍵唯一,鏈表保證鍵有序

LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>(); lhm.put(01, '張三1'); lhm.put(02, '張三2'); lhm.put(03, '張三3'); lhm.put(04, '張三4'); lhm.put(05, '張三5');Set<Integer> keys = lhm.keySet(); for (Integer key : keys) { System.out.println(key + '|' + lhm.get(key)); }

TreeMap

基于紅黑樹(shù)(Red-Black tree)的 NavigableMap 實(shí)現(xiàn)。該映射根據(jù)其鍵的自然順序進(jìn)行排序,或者根據(jù)創(chuàng)建映射時(shí)提供的 Comparator 進(jìn)行排序,

具體取決于使用的構(gòu)造方法。

特點(diǎn):

鍵可排序,唯一, 值有序,可重復(fù),類(lèi)似于List 底層數(shù)據(jù)結(jié)構(gòu)是自平衡的二叉樹(shù),可排序

排序方式類(lèi)似于TreeSet,分為自然排序和比較器排序,具體取決于使用的構(gòu)造方法

TreeMap<Integer, String> tm = new TreeMap<Integer, String>(); tm.put(24, 'Hello1'); tm.put(14, 'Hello2'); tm.put(34, 'Hello3'); tm.put(124, 'Hello4'); tm.put(24, 'Hello5'); tm.put(24, 'Hello6'); tm.put(24, 'Hello7'); tm.put(244, 'Hello8'); tm.put(624, 'Hello9'); tm.put(24, 'Hello10'); Set<Integer> keys = tm.keySet(); for (Integer key : keys) { String value = tm.get(key); System.out.println(key + '|' + value); }

HashTable

此類(lèi)實(shí)現(xiàn)一個(gè)哈希表,該哈希表將鍵映射到相應(yīng)的值。任何非 null 對(duì)象都可以用作鍵或值

特點(diǎn):

不允許null鍵和null值 線程安全,效率低

HashMap和Hashtable的區(qū)別:

HashMap是不安全的不同步的效率高的 允許null鍵和null值 Hashtable是安全的同步的效率低的 不允許null鍵和null值

底層都是哈希表結(jié)構(gòu)

Hashtable<String, String> hashtable = new Hashtable<String, String>(); hashtable.put('劉備', '孫尚香'); hashtable.put('孫策', '大喬'); hashtable.put('周瑜', '小喬'); hashtable.put('呂布', '貂蟬'); System.out.println(hashtable); Enumeration<String> keys = hashtable.keys(); while (keys.hasMoreElements()) { String key = keys.nextElement(); String value = hashtable.get(key); System.out.println(key + '|' + value); }

WeakHashMap

以弱鍵 實(shí)現(xiàn)的基于哈希表的 Map。在 WeakHashMap 中,當(dāng)某個(gè)鍵不再正常使用時(shí),將自動(dòng)移除其條目。更精確地說(shuō),對(duì)于一個(gè)給定的鍵,其映射的存在并不阻止垃圾回收器對(duì)該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。丟棄某個(gè)鍵時(shí),其條目從映射中有效地移除,因此,該類(lèi)的行為與其他的 Map 實(shí)現(xiàn)有所不同。

WeakHashMap<String,String> whm = new WeakHashMap<>(); whm.put(new String('hello1'), 'world1'); whm.put(new String('hello2'), 'world2'); whm.put(new String('hello3'), 'world3'); whm.put('hello4', 'world3'); System.out.println(whm); System.gc(); System.runFinalization(); System.out.println(whm);

鍵是枚舉類(lèi)型

EnumMap<Direction, String> em = new EnumMap<>(Direction.class); em.put(Direction.UP, '向上移動(dòng)'); em.put(Direction.DOWN, '向下移動(dòng)'); em.put(Direction.LEFT, '向左移動(dòng)'); em.put(Direction.RIGHT, '向右移動(dòng)');Set<Direction> keys = em.keySet(); for (Direction key : keys) { String value = em.get(key); System.out.println(key + '|' + value); }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 久久网视频 | 亚洲mm8成为人影院 亚洲m男在线中文字幕 | 色多多香蕉 | 欧美日韩国产综合一区二区三区 | 亚洲精品a | 久久久久久久99久久久毒国产 | 日韩在线国产 | 一级做a爱久久久久久久 | 国产精品国产三级国产在线观看 | 亚洲波多野结衣日韩在线 | 精品国产区 | 精品国产欧美一区二区最新 | 免费观看欧美性一级 | 日韩三级免费看 | 国产在线精品香蕉综合网一区 | 美女视频免费黄色 | 久久国产一片免费观看 | 精品欧美一区二区三区免费观看 | 成年人在线视频免费观看 | 国产精品国内免费一区二区三区 | 一级女性全黄久久生活片免费 | 99精品视频一区在线视频免费观看 | 亚洲视频一区二区在线观看 | 一区二区三区免费视频网站 | 毛片3| 成年女人毛片免费观看97 | 成人小视频在线观看免费 | 欧美一级免费 | 99在线热视频 | 日本欧美精品 | 日韩美女一级片 | 日韩在线视屏 | 久久久久久久国产精品 | 久久综合久久88 | 日韩毛片免费在线观看 | 国产美女一区二区在线观看 | 欧美极品在线播放 | 国产男女猛烈无遮档免费视频网站 | 精品无码三级在线观看视频 | 日韩精品一区二区三区中文字幕 | 国产成人精品免费视频大全五级 |