Java中Map接口使用以及有關集合的面試知識點匯總
Map接口
存儲特點
- 以鍵(key)值(value)對的形式存儲
- 鍵無序、無下標、元素不可重復
- 值無序、無下標、元素可以重復
常用實現類
- HashMap
JDK1.2 底層哈希表實現 線程不安全,效率高 - LinkedHashMap
JDK1.2 是HashMap的子類,底層哈希表實現 線程不安全,效率高 - TreeMap
JDK1.2 是SortedMap的實現類,底層紅黑樹實現 線程不安全,效率高 - HashTable
JDK1.0 底層哈希表實現 線程安全,效率低 - Properties
JDK1.0 是HashTable的子類,底層哈希表實現 線程安全,效率低
創建方法
- 使用多態
Map<鍵的泛型,值的泛型> 集合名=new 實現類名<鍵的泛型,值的泛型>();
tips:一個鍵值對才是一個元素
常用方法
- 值 put(鍵,值):將一個鍵值對添加至集合末尾
如果鍵已經存在,則進行值的替換 - void clear():清空集合元素
- boolean containsKey(鍵):判斷集合中是否存在某個鍵
- boolean containsValue(值):判斷集合中是否存在某個值
- 值 get(鍵):獲取鍵對應的值
- boolean isEmpty():判斷集合內容是否為空,不能判比null值
- void putAll(Map的集合名):將指定Map集合的內容添加至當前集合末尾
- 值 remove(鍵):移除鍵所對應的鍵值對
- int size():獲取集合鍵值對的個數
代碼舉例:
public class Test { public static void main(String[] args) { //數字-String 1 - 一 1 - yi Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "一"); map.put(111, "yiyiyi"); map.put(666, "liuliuliu"); map.put(111, "一一一"); System.out.println(map.containsKey(678));//f System.out.println(map.containsValue("yiyiyi"));//t System.out.println(map.get(111)); map.remove(666); System.out.println(map.get(666)); System.out.println(map.size());//2 } }
遍歷方法
1、keySet()+get()
- 先獲取所有的鍵,再遍歷鍵得到所有的值
- Set<鍵的泛型> keySet():獲取所有的鍵存於Set集合並返回
//獲取所有鍵 Set<鍵的泛型> set=集合名.keySet(); //遍歷所有鍵 set.forEach( o-> //o就代表當前正在被遍歷的鍵 //通過集合名.get(o)可以得到對應的值 ); 如: Map<Integer, String> map = new HashMap<>(); map.put(123, "yiersan"); map.put(234, "ersansi"); map.put(456, "siwuliu"); map.put(999, "jiujiujiu"); Set<Integer> set=map.keySet(); set.forEach(o-> System.out.println("鍵:"+o+",值:"+map.get(o)));
2、values()
- 直接獲取所有的值
- Collection<值的泛型> values():獲取所有的值存於Collection集合並返回
Collection<值的泛型> coll = 集合名.values(); coll.forEach(v-> v就代表當前的值); 如: Collection<String> coll = map.values(); coll.forEach(v-> System.out.println(v));
3、entrySet()
- 獲取鍵值對對象進行遍歷
- Set< Map.Entry<鍵的泛型,值的泛型> > entrySet():獲取所有的鍵值對對象存於Set集合並返回
- Set< Map.Entry<鍵的泛型,值的泛型> > 等同於 Set<鍵值對對象>
- getKey():獲取Entry對象中的鍵
- getValue():獲取Entry對象中的值
//獲取鍵值對對象集合 Set<Map.Entry<鍵的泛型,值的泛型>> set2=集合名.entrySet(); for (Map.Entry entry : set2) { //通過entry.getKey()獲取鍵 //通過entry.getValue()獲取值 } 如: Set<Map.Entry<鍵的泛型,值的泛型>> set2=集合名.entrySet(); for (Map.Entry entry : set2) { System.out.println("鍵:"+entry.getKey()+",值:"+entry.getValue()) } System.out.println("lambda自遍歷:"); set2.forEach(entry-> System.out.println("鍵:"+entry.getKey()+",值:"+entry.getValue()));
4、自遍歷forEach
JDK8.0
集合名.forEach(new BiConsumer<鍵的泛型, 值的泛型>() { @Override public void accept(鍵的泛型 i, 值的泛型 s) { //i代表鍵 //s代表值 } }); System.out.println("lambda簡化自遍歷:"); map.forEach((k,v)-> k代表鍵,v代表值); 如: map.forEach(new BiConsumer<Integer, String>() { @Override public void accept(Integer i, String s) { System.out.println("鍵:"+i+",值:"+s); } }); System.out.println("lambda簡化自遍歷:"); map.forEach((k,v)-> System.out.println("鍵:"+k+",值:"+v));
不同實現類的使用
- HashMap可以存放null值,鍵可以存放0-1個null,值可以存放0-n個null
- LinkedHashMap可以保證存入取出順序一致
- TreeMap可以根據鍵進行默認的升序排序
- 不能對null進行默認排序
- 如果鍵為自定義類型,則必須設置排序規則,方式與TreeSet一致
- HashTable不能存放null值
- Properties鍵和值必須為String類型
- 創建不建議使用多態
- 不能聲明泛型
集合面試知識點補充
- Set是一個隻有鍵,沒有值的Map集合
- 底層數組長度為16
- 數組加載因子為75%,當數組位使用到達75%時,會以平衡二叉樹的方式進行數組擴容,擴容長度為原長度*2,擴容出來的每個數組長度都為16
- 為什麼Set或者Map在存放數值的時候,是從小到大的?
當存放數值過小時,整數值本身就是它的存放下標,下標從小到大,所以值的存放也是從小到大 - 紅黑樹使用的是二分查找法,特點為查詢效率快
- 紅黑樹:以哈希碼值為判斷標準,哈希碼值比當前元素大,往右側存儲,哈希碼值比當前元素小,往左側存儲
- 二分查找法:特點為一次鎖定數據的一半
- 當哈希表的數組中某個鏈表長度達到瞭8時,會重組鏈表元素,開啟紅黑樹
補充:Java Map集合面試題匯總
1、 你都知道哪些常用的Map集合?
HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。
2、Collection集合接口和Map接口有什麼關系?
沒關系,Collection是List、Set父接口不是Map父接口。
3、HashMap是線程安全的嗎?線程安全的Map都有哪些?性能最好的是哪個?
HashMap不是線程安全的。線程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。
4、使用HashMap有什麼性能問題嗎?
使用HashMap要註意避免集合的擴容,它會很耗性能,根據元素的數量給它一個初始大小的值。
5、HashMap的數據結構是怎樣的?默認大小是多少?內部是怎麼擴容的?
HashMap是數組和鏈表組成的,默認大小為16,當hashmap中的元素個數超過數組大小*loadFactor(默認值為0.75)時就會把數組的大小擴展為原來的兩倍大小,然後重新計算每個元素在數組中的位置。
6、怎麼按添加順序存儲元素?怎麼按A-Z自然順序存儲元素?怎麼自定義排序?
按添加順序使用LinkedHashMap,按自然順序使用TreeMap,自定義排序TreeMap(Comparetor c)。
7、HashMap的鏈表結構設計是用來解決什麼問題的?
HashMap的鏈表結構設計是用來解決key的hash沖突問題的。
8、HashMap的鍵、值可以為NULL嗎?HashTable呢?
HashMap的鍵值都可以為NULL,HashTable不行。
9、HashMap使用對象作為key,如果hashcode相同會怎麼處理?
key的hash沖突,如果key equals一致將會覆蓋值,不一致就會將值存儲在key對應的鏈表中。
10、HashMap中的get操作是什麼原理?
先根據key的hashcode值找到對應的鏈表,再循環鏈表,根據key的hash是否相同且key的==或者equals比較操作找到對應的值。
結語
到此這篇關於Java中Map接口使用以及有關集合的面試知識點匯總的文章就介紹到這瞭,更多相關Java中Map接口使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中遍歷Map集合的5種方式總結
- Java 深入淺出掌握Map集合之雙列集合
- 淺談HashMap中7種遍歷方式的性能分析
- java中HashMap的7種遍歷方式與性能分析
- Java那點兒事之Map集合不為人知的秘密有哪些