天天看點

常見List面試問題

List的相關文章,沒有太多想寫的,早先的時候有提到過兩篇

除此之外還有一些經常被問到的問題,我從Hollis的知識星期收集一下,用到這裡,供一起學習

問題

  1. Java 中 Set 與 List 有什麼不同?

相同點:都是繼承Collection的接口,都是用來存儲一組相同類型的元素

不同點:

  • List有序存儲,元素可重複
  • Set無序存儲,元素不可重複

注意:Set在插入時是要有一定的方法來判斷元素是否重複的,這個方法很重要,決定了set種可以儲存那些元素,Java中的HashSet使用的是HashMap來存儲,弄明白HashMap原理之後就明白HashSet的原理了。

  1. Java中的List有幾種實作,各有什麼不同?

    Vector,ArrayList,LinkedList 還差Vector沒有說到,Vector實作方式與ArrayList類似,不過在方法上加了Synchronized關鍵字來保證現場安全。

ArrayList 是一個可改變大小的數組.當更多的元素加入到ArrayList中時,其大小将會動态地增長.内部的元素可以直接通過get與set方法進行通路,因為ArrayList本質上就是一個數組.

LinkedList 是一個雙連結清單,在添加和删除元素時具有比ArrayList更好的性能.但在get與set方面弱于ArrayList.

當然,這些對比都是指資料量很大或者操作很頻繁的情況下的對比,如果資料和運算量很小,那麼對比将失去意義.

Vector 和ArrayList類似,但屬于強同步類。如果你的程式本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那麼使用ArrayList是更好的選擇。

Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.

而 LinkedList 還實作了 Queue 接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等.

注意: 預設情況下ArrayList的初始容量非常小,是以如果可以預估資料量的話,配置設定一個較大的初始值屬于最佳實踐,這樣可以減少調整大小的開銷。

  1. 什麼是fail-fast,什麼是fail-safe,有什麼差別嗎?

    fail-fast字面意思,快速失敗,也就是當集合類遇到資料問題時時立刻抛出異常,正常的集合類都是如此,在多線程同時操作時會立刻抛出concurrentmodificationexception

fail-safe當集合類在多線程環境下處理的時候,遇到問題時,不會抛出異常,而是繼續執行下去。

以上是個人了解。

  1. 通過Array.asList獲得的List有何特點,使用時應該注意什麼?

    Array.asList擷取的清單,使用的是擴充卡模式,其List是Array内部的實作,内部的資料指向的還是數組,并且不支援插入,删除操作。

解:1. asList 得到的隻是一個 Arrays 的内部類,一個原來數組的視圖 List,是以如果對它進行增删操作會報錯
  1. 用 ArrayList 的構造器可以将其轉變成真正的 ArrayList

最後

以上是常問道的關于List相關的問題,一次小小的總結。