集合 List Map Set

集合

https://github.com/JsonChao/Awesome-Android-Interview/blob/master/Java%E7%9B%B8%E5%85%B3/Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E9%A2%98.md

1. List:有序,可重複;索引查詢速度快;插入刪除伴隨數據移動,速度慢;
2. Set:無序。不可重複;重複元素會覆蓋。

檢索元素效率很低,插入和刪除效率高,插入和刪除不會引起元素位置的改變。

3. Map:鍵值對,鍵唯一,值多個;

image

4. 線程安全集合類與非線程安全集合類
非線程安全 線程安全
LinkedList、ArrayList、HashSet Vector
HashMap HashTable
StringBuilder StringBuffer
5. ArrayList和LinkedList是怎麼擴容的?

ArrayList:初始大小是10,擴容規則:新增的時候發現容量不夠用了,就去擴容,擴容後的大小=原始大小+原始大小/2 + 1

LinkedList:是一個雙向鏈表,沒有初始大小,也沒有擴容機制,就是一直在前面或者後面新增就好。

6.ArrayList與Vector的區別和適用場景

區別:

  • (1):Vector線程安全的,多線程訪問代碼,不會產生不確定的結果。而ArrayList不是,Vector類中的方法很多有synchronied進行修飾,這樣就導致了Vector在效率上比ArrayList慢很多。
  • (2):兩個都是採用線性連續空間存儲元素,但是當空間充足的時候,兩個類的增加方式不同。
  • (3):Vector可以設置增長因子,而ArrayList不可以。
  • (4):Vector是一種老的動態數組,是線程同步的。效率低不贊成是使用。

場景:

  • Vector是線程同步,所以也是線程安全的。如果不考慮線程的安全因素,一般用ArrayList效率會比較高。
  • 如果集合中的元素數目大於目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。
7.HashSet和TreeSet的區別和適用場景

區別:

  • TreeSet是二叉樹(紅黑樹的數據結構)實現的,TreeSet中的數據是自動排好順序的,不允許放入null值。
  • HashSet是哈希表實現的,數據是無序的可以放入null,但只能放入一個null,兩者之中的值都不重複。就如數據庫中的唯一約束。
  • HashSet要求放入的對象必須實現HashCode()方法,放的對象,是以hashcode碼作爲標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重複,但是同一個類的對象可以放入不同的實例。

場景:
hashSet是基於Hash算法實現的,其性能通常都優於TreeSet。爲快速查找而設計的Set,我們通常都應該適用HashSet,在我們需要排序的時候,才使用TreeSet.

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 7029
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章