Java集合框架底層實現 --原始碼
阿新 • • 發佈:2019-01-09
List:
- ArrayList 陣列實現
/** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA * will be expanded to DEFAULT_CAPACITY when the first element is added. */ transient Object[] elementData; /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
- ArrayList 在擴容的時候是採用的 copy 方法:
/** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ 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); }
- LinkedList 雙向連結串列
// This is node object. private static class Node<E> { E item; LinkedList.Node<E> next; LinkedList.Node<E> prev; Node(LinkedList.Node<E> prev, E element, LinkedList.Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
Set:
- HashSet 由 HashMap 實現:
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
- TreeSet 由 TreeMap 實現:
/**
* The backing map.
*/
private transient NavigableMap<E,Object> m;
/**
* Constructs a set backed by the specified navigable map.
*/
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
- LinkedHashSet 由 HashSet 實現:
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
}
Queue:
- queue介面不包括併發容器的話常用的實現有 LinkedList 和 ArrayDqueue, 具體的實現結構分別是連結串列和陣列.
Map:
- HashMap 陣列連結串列和雜湊機制實現(速度最快) ---HashMap的雜湊原理
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; // 注意此處的 next 引用
....省略其他無關程式碼
}
- TreeMap 由連結串列實現的 二叉排序樹實現.
- LinkedHashMap 繼承自 HashMap, 由 HashMap 實現
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>