面試本質上,是對問題的理解程度以及求職者是否符合用人單位的預期。但是繁雜的面試題目,讓求職者忙於應付。因此,在這裏按照之前java的學習路線維度,精煉出提問率最高的知識點(該篇幅主要以java基礎爲主)
集合下的三大類:List,map和set
1.List的三大實現類:ArrayList、LinkedList、Vector的區別。
1.1 LinkedList
基於鏈表實現,鏈表內存是散列的,增刪快,查找慢;
1.2 ArrayList
基於數組實現,非線程安全,效率高,增刪慢,查找快;
1.3 Vector
基於數組實現,線程安全,效率低,增刪慢,查找慢;
2.Map的三大實現類:HashMap、和HashTable和TreeMap的區別
2.1 HashMap
基於 hash 表的實現,非線程安全,高效,支持 null 值和 null鍵;
2.2 HashTable
線程安全,低效,不支持 null 值和 null 鍵;
2.3 TreeMap接口
能夠把它保存的記錄根據鍵排序,默認是鍵值的升序排序
3.Set的兩個實現類:HashSet和LinkedHashSet
3.1 HashSet
底層是由 Hash Map 實現,不允許集合中有重複的值,使用該方式時需要重寫 equals()和 hash Code()方法;
3.2 LinkedHashSet
繼承於 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMap
衍生的問題:
1. 三者的區別
1.1 List 集合中對象按照索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象,例如通過list.get(i)方法來獲取集合中的元素;
1.2 Map 以鍵值對結構出現,對象不可以重複,但值對象可以重複;
1.3 Set 不能存儲重複對象,但是實現類能對集合中的對象按照特定的方式排序,例如 TreeSet 等,在java1.8中,也可以通過實現 Java.util.Comparator< Type >接口來自定義排序。”
2. HashMap和HashTree哪個耗時多?
HashTree,因爲tree需要在插入後,還要進行一輪排序操作。
3. Vector爲什麼是線程安全的?
線程安全:所謂的線程安全是指調用類的成員方法時,其他線程不能再訪問該對象。
3.1 Vector的同步操作有synchronized關鍵字
3.2 Vector類的成員方法時,其他線程不能再訪問該Vector對象。
字符串下的類型:String, StringBuffer和StringBuilder
1.String
String是字符串常量,它的值不能改變,改變的是引用
2.StringBuilder
StringBuilder是字符串變量,它的值是可以改變的,StringBuilder支持單線程
3.StringBuffer
StringBuffer是線程安全版的StringBuilder,繼承StringBuilder的特性,StringBuffer支持多線程
衍生的問題:
1. 三者的區別
1.1 String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量,常量在創建後不可改變,變量則是可以改變的。
1.2 StringBuilder是線程不安全的,而StringBuffer是線程安全的。(線程安全上面已經解釋)StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全。
1.3 因此,String適用於字符串對象少且更改頻次小的操作,StringBuilder適用於單線程下在字符緩衝區進行大量操作的情況,StringBuffer適用多線程下在字符緩衝區進行大量操作的情況。
HashMap和ConcurrentHashMap的區別
1. HashMap
線程不安全
2.ConcurrentHashMap
線程安全,效率高,天然支持多線程
衍生的問題:
ConcurrentHashMap經常會被問起,而且由於1.8的更改,使得這個數據結構越發經典。毫不誇張的說,如果世界上只剩下一種數據結構,那麼我一定考慮HashMap,但是由於其線程不安全的特性,我會更進一步的考慮ConcurrentHashMap。
1. 先從HashMap說起,因爲線程不安全,在併發操作下,會引起死循環的情況。而ConcurrentHashMap則是線程安全的,利用經典的“鎖分段”思路來引導了整個數據結構的線程安全。
2. 爲什麼叫“鎖分段”呢?
簡單來說,一個數據結構同一時間加一個鎖,下一個進程進入後,要等這個鎖解開,纔可以進行下一段的操作,這樣就可以通過鎖來保證線程安全。但是ConcurrentHashMap不一樣,他一次性給數據結構加多個鎖,每一個鎖對應自己數據結構中的拆分出來的一部分數據,這樣的情況下,就能給天然的支持併發了。
3. 那麼這樣的結構是怎麼實現的呢?
ConcurrentHashMap 類中包含兩個靜態內部類 HashEntry 和 Segment。HashEntry 用來封裝映射表的鍵 / 值對;Segment 用來充當鎖的角色,每個 Segment 對象守護整個散列映射表的若干個桶。每個Segment守護者一個HashEntry數組裏的元素,當對HashEntry數組的數據進行修改時,必須首先獲得它對應的Segment鎖。
更多信息,微信搜索“計算機俱樂部”