本文快速回顧了Java中容器的知識點,用做面試複習,事半功倍。html
上篇:容器概覽,容器中用到的設計模式,List源碼java
中篇:Map源碼git
下篇:Set源碼,容器總結github
http://wiki.jikexueyuan.com/project/java-collection/hashset.html面試
https://segmentfault.com/a/1190000014391402算法
默認容量16,擴容兩倍,加載因子0.75編程
容許元素爲nullsegmentfault
實現Set接口設計模式
不保證迭代順序緩存
非同步
初始容量很是影響迭代性能
public HashSet() {map = new HashMap<>();}
若是添加的是在 HashSet 中不存在的,則返回 true;若是添加的元素已經存在,返回 false。
對於 HashSet 中保存的對象,請注意正確重寫其 equals 和 hashCode 方法,以保證放入的對象的惟一性。
HashSet 和 HashMap 的區別
重要:
HashMap中使用鍵對象來計算hashcode值
HashSet:
無序,容許爲null,底層是HashMap(散列表+紅黑樹),非線程同步
TreeSet:
有序,不容許爲null,底層是TreeMap(紅黑樹),非線程同步
LinkedHashSet:
WeakHashMap 的 Entry 繼承自 WeakReference,被 WeakReference 關聯的對象在下一次垃圾回收時會被回收。
WeakHashMap 主要用來實現緩存,經過使用 WeakHashMap 來引用緩存對象,由 JVM 對這部分緩存進行回收。
1private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> 2
Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 來實現緩存功能。
ConcurrentCache 採起的是分代緩存:
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}
Iterator替代了Enumeration,Enumeration是一箇舊的迭代器了。
與Enumeration相比,Iterator更加安全,由於當一個集合正在被遍歷的時候,它會阻止其它線程去修改集合。
區別有三點:
若是是單列的集合,咱們考慮用Collection下的子接口ArrayList和Set。
若是是映射,咱們就考慮使用Map
是否須要同步:去找線程安全的集合類使用
迭代時是否須要有序(插入順序有序):去找Linked雙向列表結構的
是否須要排序(天然順序或者手動排序):去找Tree紅黑樹類型的(JDK1.8)
估算存放集合的數據量有多大,不管是List仍是Map,它們實現動態增加,都是有性能消耗的。在初始集合的時候給出一個合理的容量會減小動態增加時的消耗
使用泛型,避免在運行時出現ClassCastException
本人目前爲後臺開發工程師,主要關注Python爬蟲,後臺開發等相關技術。
Csdn
擁有專欄:Leetcode題解(Java/Python)、爬蟲開發
知乎
https://www.zhihu.com/people/yang-zhen-dong-1/
擁有專欄:碼農面試助攻手冊
掘金
https://juejin.im/user/5b48015ce51d45191462ba55
簡書
https://www.jianshu.com/u/b5f225ca2376