線程安全的集合有:Vector,Stack(繼承了Vector),Hashtable,ConcurrentHashMaphtml
List,Set,Map三者的區別及總結java
List:對付順序的好幫手面試
List接口存儲一組不惟一(能夠有多個元素引用相同的對象),有序的對象算法
Set:注重獨一無二的性質數組
不容許重複的集合。不會有多個元素引用相同的對象。安全
Map:用Key來搜索的專家數據結構
使用鍵值對存儲。Map會維護與Key有關聯的值。兩個Key能夠引用相同的對象,但Key不能重複,典型的Key是String類型,但也能夠是任何對象。併發
Arraylist 與 LinkedList 區別框架
Arraylist底層使用的是數組(存讀數據效率高,插入刪除特定位置效率低),LinkedList底層使用的是雙向循環鏈表數據結構(插入,刪除效率特別高)。學過數據結構這門課後咱們就知道採用鏈表存儲,插入,刪除元素時間複雜度不受元素位置的影響,都是近似O(1)而數組爲近似O(n),所以當數據特別多,並且常常須要插入刪除元素時建議選用LinkedList.通常程序只用Arraylist就夠用了,由於通常數據量都不會蠻大,Arraylist是使用最多的集合類。ide
ArrayList 與 Vector 區別(爲何要用Arraylist取代Vector呢?)
Vector類的全部方法都是同步的。能夠由兩個線程安全地訪問一個Vector對象、可是一個線程訪問Vector
,代碼要在同步操做上耗費大量的時間。Arraylist不是同步的,因此在不須要同步時建議使用Arraylist。
HashMap 和 Hashtable 的區別
HashMap是非線程安全的,HashTable是線程安全的;HashTable內部的方法基本都通過synchronized修飾。
Hashtable和HashMap有幾個主要的不一樣:線程安全以及速度。僅在你須要徹底的線程安全的時候使用Hashtable,而若是你使用Java5或以上的話,請使用ConcurrentHashMap吧
HashSet 和 HashMap 區別
HashMap 和 ConcurrentHashMap 的區別
HashSet如何檢查重複
當你把對象加入HashSet時,HashSet會先計算對象的hashcode值來判斷對象加入的位置,同時也會與其餘加入的對象的hashcode值做比較,若是沒有相符的hashcode,HashSet會假設對象沒有重複出現。可是若是發現有相同hashcode值的對象,這時會調用equals()方法來檢查hashcode相等的對象是否真的相同。若是二者相同,HashSet就不會讓加入操做成功。(摘自個人Java啓蒙書《Head fist java》第二版)
hashCode()與equals()的相關規定:
==與equals的區別
comparable 和 comparator的區別?
通常咱們須要對一個集合使用自定義排序時,咱們就要重寫compareTo方法或compare方法,當咱們須要對某一個集合實現兩種排序方式,好比一個song對象中的歌名和歌手名分別採用一種排序方法的話,咱們能夠重寫compareTo方法和使用自制的Comparator方法或者以兩個Comparator來實現歌名排序和歌星名排序,第二種表明咱們只能使用兩個參數版的Collections.sort().
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; /** * TODO Collections類方法測試之排序 * @author 寇爽 * @date 2017年11月20日 * @version 1.8 */ public class CollectionsSort { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(-1); arrayList.add(3); arrayList.add(3); arrayList.add(-5); arrayList.add(7); arrayList.add(4); arrayList.add(-9); arrayList.add(-7); System.out.println("原始數組:"); System.out.println(arrayList); // void reverse(List list):反轉 Collections.reverse(arrayList); System.out.println("Collections.reverse(arrayList):"); System.out.println(arrayList); /* * void rotate(List list, int distance),旋轉。 * 當distance爲正數時,將list後distance個元素總體移到前面。當distance爲負數時,將 * list的前distance個元素總體移到後面。 Collections.rotate(arrayList, 4); System.out.println("Collections.rotate(arrayList, 4):"); System.out.println(arrayList);*/ // void sort(List list),按天然排序的升序排序 Collections.sort(arrayList); System.out.println("Collections.sort(arrayList):"); System.out.println(arrayList); // void shuffle(List list),隨機排序 Collections.shuffle(arrayList); System.out.println("Collections.shuffle(arrayList):"); System.out.println(arrayList); // 定製排序的用法 Collections.sort(arrayList, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.