BAT面試題,只要進場,必問,這些你都會了嗎?

面試本質上,是對問題的理解程度以及求職者是否符合用人單位的預期。但是繁雜的面試題目,讓求職者忙於應付。因此,在這裏按照之前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鎖。

 

更多信息,微信搜索“計算機俱樂部”

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