2020年Java集合類面試題及答案

2020年Java集合類面試題及答案

長沙一度軟件培訓(xùn)      2022-04-13 03:21:01     2

2020年Java集合類面試題及答案,1、ArrayList和LinkedList的區(qū)別?是否保證線程安全:ArrayList和LinkedList都是不同步的,也就是不保證線程安全;底層數(shù)據(jù)結(jié)構(gòu)

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細(xì)介紹

1、ArrayList和linkedList的區(qū)別?

是否保證線程安全:ArrayList和linkedList都是不同步的,也就是不保證線程安全;

底層數(shù)據(jù)結(jié)構(gòu):Arraylist底層使用的是Object數(shù)組;linkedList底層使用的是雙向循環(huán)鏈表數(shù)據(jù)結(jié)構(gòu);

插入和刪除是否受元素位置的影響:①ArrayList采用數(shù)組存儲,所以插入和刪除元素的時間復(fù)雜度受元素位置的影響。比如:執(zhí)行add(E e)方法的時候,ArrayList會默認(rèn)在將指定的元素追加到此列表的末尾,這種情況時間復(fù)雜度就是O(1)。但是如果要在指定位置i插入和刪除元素的話(add(int index,E element))時間復(fù)雜度就為O(n-i)。因為在進(jìn)行上述操作的時候集合中第i和第i個元素之后的(n-i)個元素都要執(zhí)行向后位/向前移一位的操作。②linkedList采用鏈表存儲,所以插入,刪除元素時間復(fù)雜度不受元素位置的影響,都是近似O(1)而數(shù)組為近似O(n)。

是否支持快速隨機(jī)訪問:linkedList不支持高效的隨機(jī)元素訪問,而ArrayList實現(xiàn)了RandmoAccess接口,所以有隨機(jī)訪問功能??焖匐S機(jī)訪問就是通過元素的序號快速獲取元素對象(對應(yīng)于get(int index)方法)。

內(nèi)存空間占用:ArrayList的空間浪費主要體現(xiàn)在在list列表的結(jié)尾會預(yù)留一定的容量空間,而linkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗比ArrayList更多的空間(因為要存放直接后繼和直接前驅(qū)以及數(shù)據(jù))。

補(bǔ)充:ArrayList的增刪未必就是比linkedList要慢:

如果增刪都是在末尾來操作【每次調(diào)用的都是remove()和add()】,此時ArrayList就不需要移動和復(fù)制數(shù)組來進(jìn)行操作了。如果數(shù)據(jù)量有百萬級的時,速度是會比linkedList要快的。

如果刪除操作的位置是在中間。由于linkedList的消耗主要是在遍歷上,ArrayList的消耗主要是在移動和復(fù)制上(底層調(diào)用的是arrayCopy()方法,是native方法)。linkedList的遍歷速度是要慢于ArrayList的復(fù)制移動速度的如果數(shù)據(jù)量有百萬級的時,還是ArrayList要快。

2、ArrayList實現(xiàn)RandomAccess接口有何作用?為何linkedList卻沒實現(xiàn)這個接口?

RandomAccess接口只是一個標(biāo)志接口,只要List集合實現(xiàn)這個接口,就能支持快速隨機(jī)訪問。實現(xiàn)RandomAccess接口的List集合采用一般的for循環(huán)遍歷,而未實現(xiàn)這接口則采用迭代器,即ArrayList一般采用for循環(huán)遍歷,而linkedList一般采用迭代器遍歷;

ArrayList用for循環(huán)遍歷比iterator迭代器遍歷快,linkedList用iterator迭代器遍歷比for循環(huán)遍歷快。所以說,當(dāng)我們在做項目時,應(yīng)該考慮到List集合的不同子類采用不同的遍歷方式,能夠提高性能。

Java集合類中元素的訪問分為隨機(jī)訪問和順序訪問。隨機(jī)訪問一般是通過index下標(biāo)訪問,行為類似數(shù)組的訪問。而順序訪問類似于鏈表的訪問,通常為迭代器遍歷。

以List接口及其實例為例。ArrayList是典型的隨機(jī)訪問型,而linkedList則是順序訪問型。List接口既定義了下標(biāo)訪問方法又定義了迭代器方法。所以其實例既可使用下標(biāo)隨機(jī)訪問也可以使用迭代器進(jìn)行遍歷。但這兩種方式的性能差異很明顯。

RandomAccess接口

JDK中的RandomAccess接口是一個標(biāo)記接口,它并未定義方法。其目的是用于指示實現(xiàn)類具有隨機(jī)訪問特性,在遍歷時使用下標(biāo)訪問較迭代器更快。

3.ArrayList的擴(kuò)容機(jī)制?

當(dāng)使用add方法的時候首先調(diào)用ensureCapacityInternal方法,傳入size+1進(jìn)去,檢查是否需要擴(kuò)充elementData數(shù)組的大?。?/p>

newCapacity=擴(kuò)充數(shù)組為原來的1.5倍(不能自定義),如果還不夠,就使用它指定要擴(kuò)充的大小minCapacity,然后判斷minCapacity是否大于MAX_ARRAY_SIZE(Integer.MAX_VALUE-8),如果大于,就取Integer.MAX_VALUE;

擴(kuò)容的主要方法:grow;

ArrayList中copy數(shù)組的核心就是System.arraycopy方法,將original數(shù)組的所有數(shù)據(jù)復(fù)制到copy數(shù)組中,這是一個本地方法。

5.Array和ArrayList有何區(qū)別?什么時候更適合用Array?

Array可以容納基本類型和對象,而ArrayList只能容納對象;

Array是指定大小的,而ArrayList大小是固定的。

什么時候更適合使用Array:

4.如果列表的大小已經(jīng)指定,大部分情況下是存儲和遍歷它們;

對于遍歷基本數(shù)據(jù)類型,盡管Collections使用自動裝箱來減輕編碼任務(wù),在指定大小的基本類型的列表上工作也會變得很慢;

如果你要使用多維數(shù)組,使用[][]比List>更容易。

5.什么是Iterator?

一些集合類提供了內(nèi)容遍歷的功能,通過java.util.Iterator接口。這些接口允許遍歷對象的集合。依次操作每個元素對象。當(dāng)使用Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個Iterator的時候不建議修改集合本省。

6.Iterator與ListIterator有什么區(qū)別?

Iterator:只能正向遍歷集合,適用于獲取移除元素。ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支持元素的修改。

Iterator可以遍歷Set和List集合,而ListIterator只能遍歷List

ListIterator從Iterator接口繼承,然后添加了一些額外的功能,比如添加一個元素、替換一個元素、獲取前面或后面元素的索引位置。

7.什么叫做快速失敗特性?

從高級別層次來說快速失敗是一個系統(tǒng)或軟件對于其故障做出的響應(yīng)。一個快速失敗系統(tǒng)設(shè)計用來即時報告可能會導(dǎo)致失敗的任何故障情況,它通常用來停止正常的操作而不是嘗試?yán)^續(xù)做可能有缺陷的工作。當(dāng)有問題發(fā)生時,快速失敗系統(tǒng)即時可見地發(fā)錯錯誤告警。在Java中,快速失敗與iterators有關(guān)。如果一個iterator在集合對象上創(chuàng)建了,其它線程欲“結(jié)構(gòu)化”的修改該集合對象,并發(fā)修改異常(ConcurrentModificationException)拋出。

8.為什么Vector類認(rèn)為是廢棄的或者是非官方地不推薦使用?或者說為什么我們應(yīng)該一直使用ArrayList而不是Vector?

默認(rèn)情況下你是非同步訪問的,Vector同步了每個方法,你幾乎從不要那樣做,通常有想要同步的是整個操作序列。同步單個的操作也不安全(如果你迭代一個Vector,你還是要加鎖,以避免其它線程在同一時刻改變集合).而且效率更慢。當(dāng)然同樣有鎖的開銷即使你不需要,這是個很糟糕的方法在默認(rèn)情況下同步訪問。你可以一直使用Collections.sychronizedList來裝飾一個集合。

事實上Vector結(jié)合了“可變數(shù)組”的集合和同步每個操作的實現(xiàn)。這是另外一個設(shè)計上的缺陷。Vector還有些遺留的方法在枚舉和元素獲取的方法,這些方法不同于List接口,如果這些方法在代碼中程序員更趨向于想用它。盡管枚舉速度更快,但是他們不能檢查如果集合在迭代的時候修改了,這樣將導(dǎo)致問題。盡管以上諸多原因,Oracle也從沒宣稱過要廢棄Vector。

9.哪些集合類提供對元素的隨機(jī)訪問?

ArrayList、HashMap、TreeMap和HashTable類提供對元素的隨機(jī)訪問。

10.哪些集合類是線程安全的?

Vector、HashTable、Properties和Stack是同步類,所以它們是線程安全的,可以在多線程環(huán)境下使用。

以上就是長沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)的小編針對“2020年Java集合類面試題及答案”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

Java面試題

培訓(xùn)啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險,謹(jǐn)防上當(dāng)。