List的相關文章,沒有太多想寫的,早先的時候有提到過兩篇
除此之外還有一些經常被問到的問題,我從Hollis的知識星期收集一下,用到這裡,供一起學習
問題
- Java 中 Set 與 List 有什麼不同?
相同點:都是繼承Collection的接口,都是用來存儲一組相同類型的元素
不同點:
- List有序存儲,元素可重複
- Set無序存儲,元素不可重複
注意:Set在插入時是要有一定的方法來判斷元素是否重複的,這個方法很重要,決定了set種可以儲存那些元素,Java中的HashSet使用的是HashMap來存儲,弄明白HashMap原理之後就明白HashSet的原理了。
-
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的初始容量非常小,是以如果可以預估資料量的話,配置設定一個較大的初始值屬于最佳實踐,這樣可以減少調整大小的開銷。
-
什麼是fail-fast,什麼是fail-safe,有什麼差別嗎?
fail-fast字面意思,快速失敗,也就是當集合類遇到資料問題時時立刻抛出異常,正常的集合類都是如此,在多線程同時操作時會立刻抛出concurrentmodificationexception
fail-safe當集合類在多線程環境下處理的時候,遇到問題時,不會抛出異常,而是繼續執行下去。
以上是個人了解。
-
通過Array.asList獲得的List有何特點,使用時應該注意什麼?
Array.asList擷取的清單,使用的是擴充卡模式,其List是Array内部的實作,内部的資料指向的還是數組,并且不支援插入,删除操作。
解:1. asList 得到的隻是一個 Arrays 的内部類,一個原來數組的視圖 List,是以如果對它進行增删操作會報錯
- 用 ArrayList 的構造器可以将其轉變成真正的 ArrayList
最後
以上是常問道的關于List相關的問題,一次小小的總結。