Java容器(List、Set、Map)知識點快速複習手冊(下)

前言

本文快速回顧了Java中容器的知識點,用做面試複習,事半功倍。html

上篇:容器概覽,容器中用到的設計模式,List源碼java

中篇:Map源碼git

下篇:Set源碼,容器總結github

其它知識點複習手冊

  • Java基礎知識點面試手冊(上)
  • Java基礎知識點面試手冊(下)
  • Java容器(List、Set、Map)知識點快速複習手冊(上)
  • Java容器(List、Set、Map)知識點快速複習手冊(中)

HashSet

http://wiki.jikexueyuan.com/project/java-collection/hashset.html面試

https://segmentfault.com/a/1190000014391402算法

關鍵詞:

  • 默認容量16,擴容兩倍,加載因子0.75編程

  • 容許元素爲nullsegmentfault

  • 實現Set接口設計模式

  • 不保證迭代順序緩存

  • 非同步

  • 初始容量很是影響迭代性能

  • 底層其實是一個HashMap實例

public HashSet() {map = new HashMap<>();}

若是添加的是在 HashSet 中不存在的,則返回 true;若是添加的元素已經存在,返回 false。

對於 HashSet 中保存的對象,請注意正確重寫其 equals 和 hashCode 方法,以保證放入的對象的惟一性。

HashSet 和 HashMap 的區別

重要:

  1. HashMap中使用鍵對象來計算hashcode值

  2. HashSet使用成員對象來計算hashcode值,對於兩個對象來講hashcode可能相同,因此equals()方法用來判斷對象的相等性,若是兩個對象不一樣的話,那麼返回false
    Java容器(List、Set、Map)知識點快速複習手冊(下)
    在這裏插入圖片描述

TreeSet

關鍵詞

  • 實現NavigableSet接口
  • 能夠實現排序功能
  • 底層其實是一個TreeMap實例
  • 非同步
  • 不容許爲null

LinkedHashSet

關鍵詞

  • 迭代是有序的
  • 容許爲null
  • 底層其實是一個HashMap+雙向鏈表實例(其實就是LinkedHashMap)
  • 非同步
  • 性能比HashSet差一丟丟,由於要維護一個雙向鏈表
    初始容量與迭代無關(與LinkedHashMap相同),由於LinkedHashSet迭代的是雙向鏈表

總結Set

HashSet:

  • 無序,容許爲null,底層是HashMap(散列表+紅黑樹),非線程同步
    TreeSet:

  • 有序,不容許爲null,底層是TreeMap(紅黑樹),非線程同步
    LinkedHashSet:

  • 迭代有序,容許爲null,底層是HashMap+雙向鏈表,非線程同步

WeekHashMap

存儲結構

WeakHashMap 的 Entry 繼承自 WeakReference,被 WeakReference 關聯的對象在下一次垃圾回收時會被回收。

WeakHashMap 主要用來實現緩存,經過使用 WeakHashMap 來引用緩存對象,由 JVM 對這部分緩存進行回收。

1private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
2

ConcurrentCache

Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 來實現緩存功能。

ConcurrentCache 採起的是分代緩存:

  • 常常使用的對象放入 eden 中,eden 使用 ConcurrentHashMap 實現,不用擔憂會被回收(伊甸園);
  • 不經常使用的對象放入 longterm,longterm 使用 WeakHashMap 實現,這些老對象會被垃圾收集器回收。
  • 當調用 get() 方法時,會先從 eden 區獲取,若是沒有找到的話再到 longterm 獲取,當從 longterm 獲取到就把對象放入 eden 中,從而保證常常被訪問的節點不容易被回收。
  • 當調用 put() 方法時,若是 eden 的大小超過了 size,那麼就將 eden 中的全部對象都放入 longterm 中,利用虛擬機回收掉一部分不常常使用的對象。
1public final class ConcurrentCache<K, V> {
 2
 3    private final int size;
 4
 5    private final Map<K, V> eden;
 6
 7    private final Map<K, V> longterm;
 8
 9    public ConcurrentCache(int size) {
10        this.size = size;
11        this.eden = new ConcurrentHashMap<>(size);
12        this.longterm = new WeakHashMap<>(size);
13    }
14
15    public V get(K k) {
16        V v = this.eden.get(k);
17        if (v == null) {
18            v = this.longterm.get(k);
19            if (v != null)
20                this.eden.put(k, v);
21        }
22        return v;
23    }
24
25    public void put(K k, V v) {
26        if (this.eden.size() >= size) {
27            this.longterm.putAll(this.eden);
28            this.eden.clear();
29        }
30        this.eden.put(k, v);
31    }
32}

常見問題總結

Enumeration和Iterator接口的區別

Iterator替代了Enumeration,Enumeration是一箇舊的迭代器了。

與Enumeration相比,Iterator更加安全,由於當一個集合正在被遍歷的時候,它會阻止其它線程去修改集合。

區別有三點:

  • Iterator的方法名比Enumeration更科學
  • Iterator有fail-fast機制,比Enumeration更安全
  • Iterator可以刪除元素,Enumeration並不能刪除元素

ListIterator有什麼特色

  • ListIterator繼承了Iterator接口,它用於遍歷List集合的元素。
  • ListIterator能夠實現雙向遍歷,添加元素,設置元素
    Java容器(List、Set、Map)知識點快速複習手冊(下)
    在這裏插入圖片描述

    與Java集合框架相關的有哪些最好的實踐

若是是單列的集合,咱們考慮用Collection下的子接口ArrayList和Set。

若是是映射,咱們就考慮使用Map

  • 是否須要同步:去找線程安全的集合類使用

  • 迭代時是否須要有序(插入順序有序):去找Linked雙向列表結構的

  • 是否須要排序(天然順序或者手動排序):去找Tree紅黑樹類型的(JDK1.8)

  • 估算存放集合的數據量有多大,不管是List仍是Map,它們實現動態增加,都是有性能消耗的。在初始集合的時候給出一個合理的容量會減小動態增加時的消耗

  • 使用泛型,避免在運行時出現ClassCastException

  • 儘量使用Collections工具類,或者獲取只讀、同步或空的集合,而非編寫本身的實現。它將會提供代碼重用性,它有着更好的穩定性和可維護性

參考

  • https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Java%20%E5%AE%B9%E5%99%A8.md
  • 公衆號:Java3y
  • Eckel B. Java 編程思想 [M]. 機械工業出版社, 2002.
  • Java Collection Framework
  • Iterator 模式
  • Java 8 系列之從新認識 HashMap
  • What is difference between HashMap and Hashtable in Java?
  • Java 集合之 HashMap
  • The principle of ConcurrentHashMap analysis
  • 探索 ConcurrentHashMap 高併發性的實現機制
  • HashMap 相關面試題及其解答
  • Java 集合細節(二):asList 的缺陷
  • Java Collection Framework – The LinkedList Class

關注我

本人目前爲後臺開發工程師,主要關注Python爬蟲,後臺開發等相關技術。

原創博客主要內容

  • 筆試面試複習知識點手冊
  • Leetcode算法題解析(前150題)
  • 劍指offer算法題解析
  • Python爬蟲相關實戰
  • 後臺開發相關實戰

同步更新如下博客

Csdn

http://blog.csdn.net/qqxx6661

擁有專欄:Leetcode題解(Java/Python)、爬蟲開發

知乎

https://www.zhihu.com/people/yang-zhen-dong-1/

擁有專欄:碼農面試助攻手冊

掘金

https://juejin.im/user/5b48015ce51d45191462ba55

簡書

https://www.jianshu.com/u/b5f225ca2376

我的公衆號:Rude3Knife

Java容器(List、Set、Map)知識點快速複習手冊(下)

相關文章
相關標籤/搜索