更新時間:2020-02-28 11:04:32 來源:動力節點 瀏覽2465次
1.HashMap和HashTable的區別?
HashMap不是線程安全的
HashMap是map接口的實現類,是將鍵映射到值的對象,其中鍵和值都是對象,并且不能包含重復鍵,但可以包含重復值。HashMap允許nullkey和nullvalue,而HashTable不允許。
HashTable是線程安全Collection。
HashMap是HashTable的輕量級實現,他們都完成了Map接口,主要區別在于HashMap允許nullkey和nullvalue,由于非線程安全,效率上可能高于Hashtable。
區別:
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因為contains方法容易讓人引起誤解。
HashTable繼承自Dictionary類,而HashMap是Java1.2引進的Mapinterface的一個實現。
HashTable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。
2.說一下HashMap的底層結構?
HashMap的主干是一個Entry數組。Entry是HashMap的基本組成單元,每一個Entry包含一個key-value鍵值對。整體結構圖:
HashMap由數組+鏈表組成的。
數組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數組位置不含鏈表(當前entry的next指向null),那么對于查找,添加等操作很快,僅需一次尋址即可;如果定位到的數組包含鏈表,對于添加操作,其時間復雜度為O(n),首先遍歷鏈表,存在即覆蓋,否則新增;對于查找操作來講,仍需遍歷鏈表,然后通過key對象的equals方法逐一比對查找。所以,性能考慮,HashMap中的鏈表出現越少,性能才會越好。
3.為什么HashMap是線程不安全的
見20期:【20期】你知道為什么HashMap是線程不安全的嗎?
4.ArrayList和LinkedList的區別是什么?
ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
5.ArrayList和Vector的區別是什么?
1.同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。
PS:對于Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。所以,我們講課時先講老的。
2.數據增長:
ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。
Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。
即Vector增長原來的一倍,ArrayList增加原來的0.5倍。
6.Array和ArrayList有何區別?
Array可以包含基本數據類型和引用類型,ArrayList只能包含引用類型。
ArrayList是基于數組實現的,Array大小不可以調整大小,但ArrayList可以通過內部方法自動調整容量。
ArrayList是List接口的實現類,相比Array支持更多的方法和特性。
7.說一下HashSet的實現原理?
1.HashSet是基于HashMap實現的,默認構造函數是構建一個初始容量為16,負載因子為0.75的HashMap。封裝了一個HashMap對象來存儲所有的集合元素,所有放入HashSet中的集合元素實際上由HashMap的key來保存,而HashMap的value則存儲了一個PRESENT,它是一個靜態的Object對象。
2.當我們試圖把某個類的對象當成HashMap的key,或試圖將這個類的對象放入HashSet中保存時,重寫該類的equals(Objectobj)方法和hashCode()方法很重要,而且這兩個方法的返回值必須保持一致:當該類的兩個的hashCode()返回值相同時,它們通過equals()方法比較也應該返回true。通常來說,所有參與計算hashCode()返回值的關鍵屬性,都應該用于作為equals()比較的標準。
3.HashSet的其他操作都是基于HashMap的。
8.如何決定使用HashMap還是TreeMap?
見03期:【03期】如何決定使用HashMap還是TreeMap?
9.List、Set、Map之間的區別是什么?
List(列表)
List的元素以線性方式存儲,可以存放重復對象,List主要有以下兩個實現類:
1.ArrayList:長度可變的數組,可以對元素進行隨機的訪問,向ArrayList中插入與刪除元素的速度慢。JDK8中ArrayList擴容的實現是通過grow()方法里使用語句newCapacity=oldCapacity+(oldCapacity>>1)(即1.5倍擴容)計算容量,然后調用Arrays.copyof()方法進行對原數組進行復制。
LinkedList:采用鏈表數據結構,插入和刪除速度快,但訪問速度慢。
Set(集合)
Set中的對象不按特定(HashCode)的方式排序,并且沒有重復對象,Set主要有以下兩個實現類:
1.HashSet:HashSet按照哈希算法來存取集合中的對象,存取速度比較快。當HashSet中的元素個數超過數組大小*loadFactor(默認值為0.75)時,就會進行近似兩倍擴容(newCapacity=(oldCapacity<<1)+1)。
2.TreeSet:TreeSet實現了SortedSet接口,能夠對集合中的對象進行排序。
Map(映射)
Map是一種把鍵對象和值對象映射的集合,它的每一個元素都包含一個鍵對象和值對象。Map主要有以下實現類:
HashMap:HashMap基于散列表實現,其插入和查詢<K,V>的開銷是固定的,可以通過構造器設置容量和負載因子來調整容器的性能。
LinkedHashMap:類似于HashMap,但是迭代遍歷它時,取得<K,V>的順序是其插入次序,或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于紅黑樹實現。查看<K,V>時,它們會被排序。TreeMap是唯一的帶有subMap()方法的Map,subMap()可以返回一個子樹。
以上就是動力節點Java培訓機構小編介紹的“Java初級面試題框架問題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習