1.List, Set,Map是否繼承自Collection接口?
只有List和Set接口繼承於Collection接口,Map是與Collection並列的接口概念。
2.字符串常量池到底存在於內存空間的哪裏?
jdk6.0字符串常量池在方法區,方法區的具體體現可以看做是堆中的永久區。
jdk7.0java虛擬機規範中不在聲明方法區,字符串常量池存放在堆空間中。
jdk8.0 java虛擬機規範中又聲明瞭元空間,字符串常量池存放在元空間中。
3.Java中的編譯器常量是什麼?使用它又有什麼風險?
公共靜態不可變(public static final) 變量也就是我們所說的編譯器常量,這裏的public 可選的。實際上這些變量在編譯時會被替換掉,因爲編譯器知道這些變量的值,並且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,但是這個值後面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的jar。爲了避免這種情況,當你在更新依賴JAR文件時,確保重新編譯你的程序。
4.用哪兩種方式來實現集合的排序?
你可以使用有序集合,如TreeSet 或 TreeMap, 你也可以使用有順序的集合。如list,然後通過Collections.sort()來排序
5.說出JDK1.7中的三個新特性
try-with-resource語句,這樣在使用流或者資源時候,就不需要手動關閉,java會自動關閉,
Fork-Join池某種程度上實現Java版的Map-reduce。允許Switch中有String變量和文本。菱形操作符(<>)用於類型推斷,不再需要在變量聲明的右邊聲明泛型,因此可以寫出可讀寫更強、更簡潔的代碼。另一個值得一提的特性是改善異常處理,如允許在同一個catch塊中捕獲多個異常。
6.說出5個JDK1.8引入的新特性?
JAVA 8 在 Java 歷史上 是一個開創新的版本,下面JDK8中5 個主要的特性: Lambda表達式,允許像對象一樣傳遞匿名函數Stream API,充分利用現代多核CPU,可以寫出很簡潔的代碼Date與Time API,最終,有一個穩定、簡單的日期和時間庫可供你使用 擴展方法,現在,接口中可以有靜態、默認方法。重複註解,現在你可以將相同的註解在同一類型上使用多次。
7.ArrayList 源碼分析
-
ArrayList 是一種變長的集合類,基於定長數組實現,使用默認構造方法初始化出來的容量是10(1.7之後都是延遲初始化,即第一次調用add方法添加元素的時候纔將elementData容量初始化爲10)。
-
ArrrayList 允許空值和重複元素,當往 ArrayList 中添加的元素數量大於其底層數組容量時,其會通過擴容機制重新生成一個更大的數組。ArrayList擴容的長度是原長度的1.5倍
-
由於ArrayList底層基於數組實現,所以其可以保證在o(1)複雜度下完成隨機查找操作。
-
ArrayList 是非線程安全類,併發環境下,多個線程同時操作 ArrayList,會引發不可預知的異常和錯誤。
-
順序添加很方便
-
刪除和插入需要複製數組,性能差(可以使用LinkedList)
-
Integer.MAX_VALUE-8:主要是考慮到不同的JVM,有的JVM會在加入一些數據頭,當擴容後的容量大於MAX_ARRAY_SIZE,我們會去比較最小需要容量和MAX_ARRAY_SIZE作比較,如果比它大,只能取Integer.MAX_VALUE,否則Integer.MAX_VALUE-8。這個是從jdk1.7開始有的。
8.HashMap源碼分析
jdk1.8之前list+ 鏈表
jdk1.8之後list+鏈表(當鏈表長度到8時,轉化爲紅黑樹)
HashMap的擴容因子
默認0.75,也就是會浪費1/4的空間,達到擴容因子時,會將list擴容一倍,0.75是時間與空間的一個平衡值。
9.ConcurrentHashMap 源碼分析
ConcurrentHashMap所使用的鎖分段技術,首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後又按順序釋放所有段的鎖。這裏“按順序”是很重要的,否則極有可能出現死鎖,在ConcurrentHashMap內部,段數組是final的,並且其成員變量實際上也是final的。但是,僅僅是將數組聲明爲final的並不保證數組成員也是final的,這需要實現上的保證,這可以確保不會出現死鎖,因爲獲得鎖的順序是固定的。
ConcurrentHashMap 是由Segement數組結構的HashEntry數組結構組成,Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裏扮演鎖的角色,HashEntry則用於存儲鍵值對數據。一個ConcurrentHashMap裏包含一個Segment數組,Segment的結構和HashMap類似,是一種數組和鏈表結構,一個Segment裏面包含一個HashEntry數組,每個HashEntry是一個鏈表結構的元素,每個Segment守護者一個HashEntry數組,每個HashEntry是一個鏈表結構的元素,每個Segment守護者一個HashEntry數組裏的元素,當對HashEntry數組的數據進行修改時,必須首先獲得它對應的Segment鎖。