先上類結(jié)構(gòu)圖
Collection血統(tǒng)
Collection接口有三個(gè)重要的分支: Set藐鹤、Queue、List
1. Set接口
表示唯一集合赂韵,不能保證有順序教藻。
AbstracSet抽象類,提供了基礎(chǔ)實(shí)現(xiàn)右锨,HashSet,KeySet,TreeSet都是繼承該抽象類括堤。
Set接口下還有一個(gè)分支SortedSet接口,表示有序唯一集合绍移。
附:HashSet不是線程安全悄窃,如果多線程環(huán)境下需要額外做同步操作,可以使用 Collections.synchronizedSet進(jìn)行包裝蹂窖。
2. List接口
表示一個(gè)有順序的集合轧抗,集合元素可以重復(fù)。
其中LIFO(后進(jìn)先出)數(shù)據(jù)結(jié)構(gòu) Stack類 也是屬于List接口瞬测。
附:ArrayList類不是線程安全横媚,如果多線程環(huán)境下需要額外做同步操作,可以使用
Collections.synchronizedList進(jìn)行包裝月趟。
LinkedList 與 ArrayList的區(qū)別
兩個(gè)類都實(shí)現(xiàn)了List接口, ArrayList用于查詢,LinkedList用于頻繁刪除添加的場景灯蝴。
- ArrayList
ArrayList每次add,remove都會(huì)重新通過Arrays.copyOf進(jìn)行創(chuàng)建新的數(shù)組對象:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
Arrays.copyOf方法:
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
//重新分配內(nèi)存
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
- LinkedList
LinkedList是鏈表數(shù)據(jù)結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都存放下一個(gè)節(jié)點(diǎn)的引用孝宗,索引可以避免 ArrayList刪除/添加時(shí)執(zhí)行“重新分配內(nèi)存”的操作穷躁。
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
3. Queue接口
表示FIFO(先進(jìn)先出)數(shù)據(jù)結(jié)構(gòu)的隊(duì)列。
Queue接口有兩個(gè)重要分支: BlockingQueue 和 Deque因妇。
3.1 BlockingQueue
阻塞隊(duì)列,用于多線程環(huán)境问潭,屬于線程安全隊(duì)列猿诸。
例如創(chuàng)建Java線程池執(zhí)行對象(實(shí)現(xiàn)Executor接口對象)時(shí)也需要一個(gè)BlockQueue。
3.2 Deque
雙向隊(duì)列狡忙,除了 滿足了Queue的 FIFO特性梳虽,也滿足LIFO,可以從兩端進(jìn)行操作灾茁。
所以鏈表結(jié)構(gòu) LinkedList也是有這兩個(gè)特性窜觉。
Map血統(tǒng)
主要有幾個(gè)常用的類, HashMap, ConcurrentHashMap,TreeMap,HashTable