首頁 > 軟體

Java中Map介面使用以及有關集合的面試知識點彙總

2022-07-26 14:00:21

Map介面

儲存特點

  • 以鍵(key)值(value)對的形式儲存
  • 鍵無序、無下標、元素不可重複
  • 值無序、無下標、元素可以重複

常用實現類

  1. HashMap
    JDK1.2 底層雜湊表實現 執行緒不安全,效率高
  2. LinkedHashMap
    JDK1.2 是HashMap的子類,底層雜湊表實現 執行緒不安全,效率高
  3. TreeMap
    JDK1.2 是SortedMap的實現類,底層紅黑樹實現 執行緒不安全,效率高
  4. HashTable
    JDK1.0 底層雜湊表實現 執行緒安全,效率低
  5. Properties
    JDK1.0 是HashTable的子類,底層雜湊表實現 執行緒安全,效率低

建立方法

  • 使用多型

Map<鍵的泛型,值的泛型> 集合名=new 實現類名<鍵的泛型,值的泛型>();

tips:一個鍵值對才是一個元素

常用方法

  1. 值 put(鍵,值):將一個鍵值對新增至集合末尾
    如果鍵已經存在,則進行值的替換
  2. void clear():清空集合元素
  3. boolean containsKey(鍵):判斷集合中是否存在某個鍵
  4. boolean containsValue(值):判斷集合中是否存在某個值
  5. 值 get(鍵):獲取鍵對應的值
  6. boolean isEmpty():判斷集合內容是否為空,不能判比null值
  7. void putAll(Map的集合名):將指定Map集合的內容新增至當前集合末尾
  8. 值 remove(鍵):移除鍵所對應的鍵值對
  9. 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型別
    • 建立不建議使用多型
    • 不能宣告泛型

集合面試知識點補充

  1. Set是一個只有鍵,沒有值的Map集合
  2. 底層陣列長度為16
  3. 陣列載入因子為75%,當陣列位使用到達75%時,會以平衡二元樹的方式進行陣列擴容,擴容長度為原長度*2,擴容出來的每個陣列長度都為16
  4. 為什麼Set或者Map在存放數值的時候,是從小到大的?
    當存放數值過小時,整數值本身就是它的存放下標,下標從小到大,所以值的存放也是從小到大
  5. 紅黑樹使用的是二分查詢法,特點為查詢效率快
  6. 紅黑樹:以雜湊碼值為判斷標準,雜湊碼值比當前元素大,往右側儲存,雜湊碼值比當前元素小,往左側儲存
  7. 二分查詢法:特點為一次鎖定資料的一半
  8. 當雜湊表的陣列中某個連結串列長度達到了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介面使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com