集合
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:鍵值對,鍵唯一,值多個;
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.