1.HashMap和HashTable的區(qū)別?
HashMap不是線程安全的
HashMap是map接口的實(shí)現(xiàn)類,是將鍵映射到值的對(duì)象,其中鍵和值都是對(duì)象,并且不能包含重復(fù)鍵,但可以包含重復(fù)值。HashMap允許nullkey和nullvalue,而HashTable不允許。
HashTable是線程安全Collection。
HashMap是HashTable的輕量級(jí)實(shí)現(xiàn),他們都完成了Map接口,主要區(qū)別在于HashMap允許nullkey和nullvalue,由于非線程安全,效率上可能高于Hashtable。
區(qū)別:
HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。
HashTable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Mapinterface的一個(gè)實(shí)現(xiàn)。
HashTable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步。
2.說(shuō)一下HashMap的底層結(jié)構(gòu)?
HashMap的主干是一個(gè)Entry數(shù)組。Entry是HashMap的基本組成單元,每一個(gè)Entry包含一個(gè)key-value鍵值對(duì)。整體結(jié)構(gòu)圖:
HashMap由數(shù)組+鏈表組成的。
數(shù)組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數(shù)組位置不含鏈表(當(dāng)前entry的next指向null),那么對(duì)于查找,添加等操作很快,僅需一次尋址即可;如果定位到的數(shù)組包含鏈表,對(duì)于添加操作,其時(shí)間復(fù)雜度為O(n),首先遍歷鏈表,存在即覆蓋,否則新增;對(duì)于查找操作來(lái)講,仍需遍歷鏈表,然后通過(guò)key對(duì)象的equals方法逐一比對(duì)查找。所以,性能考慮,HashMap中的鏈表出現(xiàn)越少,性能才會(huì)越好。
3.為什么HashMap是線程不安全的
見(jiàn)20期:【20期】你知道為什么HashMap是線程不安全的嗎?
4.ArrayList和linkedList的區(qū)別是什么?
ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),linkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于linkedList,因?yàn)閘inkedList要移動(dòng)指針。
對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。
5.ArrayList和Vector的區(qū)別是什么?
1.同步性:
Vector是線程安全的,也就是說(shuō)是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個(gè)線程會(huì)訪問(wèn)到集合,那最好是使用ArrayList,因?yàn)樗豢紤]線程安全,效率會(huì)高些;如果有多個(gè)線程會(huì)訪問(wèn)到集合,那最好是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫線程安全的代碼。
PS:對(duì)于Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問(wèn)題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時(shí)才提供的,它們是線程不安全的。所以,我們講課時(shí)先講老的。
2.數(shù)據(jù)增長(zhǎng):
ArrayList與Vector都有一個(gè)初始的容量大小,當(dāng)存儲(chǔ)進(jìn)它們里面的元素的個(gè)數(shù)超過(guò)了容量時(shí),就需要增加ArrayList與Vector的存儲(chǔ)空間,每次要增加存儲(chǔ)空間時(shí),不是只增加一個(gè)存儲(chǔ)單元,而是增加多個(gè)存儲(chǔ)單元,每次增加的存儲(chǔ)單元的個(gè)數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。
Vector默認(rèn)增長(zhǎng)為原來(lái)兩倍,而ArrayList的增長(zhǎng)策略在文檔中沒(méi)有明確規(guī)定(從源代碼看到的是增長(zhǎng)為原來(lái)的1.5倍)。ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長(zhǎng)的空間大小,而ArrayList沒(méi)有提供設(shè)置增長(zhǎng)空間的方法。
即Vector增長(zhǎng)原來(lái)的一倍,ArrayList增加原來(lái)的0.5倍。
6.Array和ArrayList有何區(qū)別?
Array可以包含基本數(shù)據(jù)類型和引用類型,ArrayList只能包含引用類型。
ArrayList是基于數(shù)組實(shí)現(xiàn)的,Array大小不可以調(diào)整大小,但ArrayList可以通過(guò)內(nèi)部方法自動(dòng)調(diào)整容量。
ArrayList是List接口的實(shí)現(xiàn)類,相比Array支持更多的方法和特性。
7.說(shuō)一下HashSet的實(shí)現(xiàn)原理?
1.HashSet是基于HashMap實(shí)現(xiàn)的,默認(rèn)構(gòu)造函數(shù)是構(gòu)建一個(gè)初始容量為16,負(fù)載因子為0.75的HashMap。封裝了一個(gè)HashMap對(duì)象來(lái)存儲(chǔ)所有的集合元素,所有放入HashSet中的集合元素實(shí)際上由HashMap的key來(lái)保存,而HashMap的value則存儲(chǔ)了一個(gè)PRESENT,它是一個(gè)靜態(tài)的Object對(duì)象。
2.當(dāng)我們?cè)噲D把某個(gè)類的對(duì)象當(dāng)成HashMap的key,或試圖將這個(gè)類的對(duì)象放入HashSet中保存時(shí),重寫該類的equals(Objectobj)方法和hashCode()方法很重要,而且這兩個(gè)方法的返回值必須保持一致:當(dāng)該類的兩個(gè)的hashCode()返回值相同時(shí),它們通過(guò)equals()方法比較也應(yīng)該返回true。通常來(lái)說(shuō),所有參與計(jì)算hashCode()返回值的關(guān)鍵屬性,都應(yīng)該用于作為equals()比較的標(biāo)準(zhǔn)。
3.HashSet的其他操作都是基于HashMap的。
8.如何決定使用HashMap還是TreeMap?
見(jiàn)03期:【03期】如何決定使用HashMap還是TreeMap?
9.List、Set、Map之間的區(qū)別是什么?
List(列表)
List的元素以線性方式存儲(chǔ),可以存放重復(fù)對(duì)象,List主要有以下兩個(gè)實(shí)現(xiàn)類:
1.ArrayList:長(zhǎng)度可變的數(shù)組,可以對(duì)元素進(jìn)行隨機(jī)的訪問(wèn),向ArrayList中插入與刪除元素的速度慢。JDK8中ArrayList擴(kuò)容的實(shí)現(xiàn)是通過(guò)grow()方法里使用語(yǔ)句newCapacity=oldCapacity+(oldCapacity>>1)(即1.5倍擴(kuò)容)計(jì)算容量,然后調(diào)用Arrays.copyof()方法進(jìn)行對(duì)原數(shù)組進(jìn)行復(fù)制。
linkedList:采用鏈表數(shù)據(jù)結(jié)構(gòu),插入和刪除速度快,但訪問(wèn)速度慢。
Set(集合)
Set中的對(duì)象不按特定(HashCode)的方式排序,并且沒(méi)有重復(fù)對(duì)象,Set主要有以下兩個(gè)實(shí)現(xiàn)類:
1.HashSet:HashSet按照哈希算法來(lái)存取集合中的對(duì)象,存取速度比較快。當(dāng)HashSet中的元素個(gè)數(shù)超過(guò)數(shù)組大小*loadFactor(默認(rèn)值為0.75)時(shí),就會(huì)進(jìn)行近似兩倍擴(kuò)容(newCapacity=(oldCapacity<<1)+1)。
2.TreeSet:TreeSet實(shí)現(xiàn)了SortedSet接口,能夠?qū)现械膶?duì)象進(jìn)行排序。
Map(映射)
Map是一種把鍵對(duì)象和值對(duì)象映射的集合,它的每一個(gè)元素都包含一個(gè)鍵對(duì)象和值對(duì)象。Map主要有以下實(shí)現(xiàn)類:
HashMap:HashMap基于散列表實(shí)現(xiàn),其插入和查詢<K,V>的開銷是固定的,可以通過(guò)構(gòu)造器設(shè)置容量和負(fù)載因子來(lái)調(diào)整容器的性能。
linkedHashMap:類似于HashMap,但是迭代遍歷它時(shí),取得<K,V>的順序是其插入次序,或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于紅黑樹實(shí)現(xiàn)。查看<K,V>時(shí),它們會(huì)被排序。TreeMap是唯一的帶有subMap()方法的Map,subMap()可以返回一個(gè)子樹。
以上就是天津卓眾教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java初級(jí)面試題框架問(wèn)題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。