Java 類集複習總結

類集複習(閱讀部分源碼)

1.ArrayList、Vector、LinkedList的關係與區別

  1. 以上三個類都是List接口下的常用子類,其中ArrayList與Vector基於數組實現,LinkedList基於雙向鏈表實現
  2. ArrayList採用懶加載策略(第一次add時才初始化內部數組,默認初始化大小爲10),擴容時擴容爲原先數組的1.5倍,採用異步處理,線程不安全,性能較高。ArrayList在大部分場合(頻繁查找、在集合末端插入與刪除)都會使用到
  3. Vector在產生對象時就初始化內部數組爲10,擴容時擴容爲原先數組的2倍,採用synchronized修飾增刪查改方法,線程安全性能較低(鎖的力度太足,將當前集合對象鎖住,導致讀讀都互斥),JDK內置的棧,是Vector的子類 用不到,性能太低
  4. LinkedList採用異步處理,線程不安全。在任意位置的頻繁插入與刪除時考慮使用,LinkedList是Queue接口的常用子類

2、什麼的jcl中fail-fast機制?什麼是fail-safe?

什麼是快速失敗?
優先考慮出現異常的情況,若異常產生,拋出異常,程序終止

jcl爲何會產生ConcurrentModificationException?
if(modCount != exceptionModCount)
modCount 記錄當前集合被修改(結構上)的次數
exceptionModCount 迭代器內部希望集合的修改次數(在獲取集合迭代器時賦值,等於當前的集合修改次數)

意義: 避免多線程場景下的數據髒讀問題,當有一個線程修改了數據,立馬通知其他線程讀取到過期的數據
java.util包下的直接子類 ArrayList、Vector、HashMap等都是fail-fast(除了TreeMap)
如何解決fail-fast:
a、多線程讀,單線程寫(在迭代遍歷集合時,不要修改集合結構)
b、使用fail-safe 不拋出異常(juc包下的線程安全集合,如CopyOnWriteArrayList,ConcurrentHashMap等)

3、hashCode與equals的關係
hasnCode() :將任意一個對象根據指定的算法轉爲32位的int
equals():比較兩個對象是否相等

equals相等的兩個對象,hashCode是否相等 —— 一定相等
hashCode相等的兩個對象,equals是否相等 —— 不一定相等

4、Java中實現一個類的兩個對象的大小比較的兩種方式(內部排序 外部排序)

內部排序:Comparable

若一個類實現了Comparable接口,表示該類具備天然的可比較特性
int compareTo(Object o)

  • 返回 0 表示量對象相等
  • 返回大於0 表示當期對象大於目標對象
  • 返回小於0 表示當前對象小於目標對象

外部排序:Comparator
類本身不具備天然的可比較特性,專門有一個類來比較其大小關係——比較器實現 Comparator
int compare (Object o1, Object o2);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章