ArrayList
- 允许添加null值。
- 和vector是等价的,但是vector是线程安全的。
- 内部使用Object[] elementData来存储数据
LinkedList
- LinkedList中的Node节点的结构
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next){
this.item = element;
this.next = next;
this.prev = prev;
}
}
Vector
- 线程安全
- 使用Object[] elementData来存储数据
- 如果不提供capacityIncrement参数,那么每次会把size增加一倍
Stack
- 继承于Vector,线程安全
HashMap
- 允许key和value为null,和HashTable相比是非线程安全的
- 内部采用数组来存放数据Node<K,V>[] table,put方法中通过K的hash值来计算出对象在table数组中的下标,通过链表来存放相同hash值的对象
static class Node<K,V> implements Map.Entry<K, V>{
final int hash;
final K key;
V value;
Node<K, V> next;
Node(int hash, K key, V value, Node<K, V> next){
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
LinkedHashMap
- 有序,默认按照插入的先后顺序排序,使用LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)构造对象,将accessOrder传入true,按照访问顺序排序,最近访问的排在最后面
- 继承自HashMap<K,V>,内部使用了一个双向链表,LinkeHashMap.Entry<K, V> head用于记录链表首节点,LinkedHashMap.Entry<K,V> tail用于记录链表的尾节点
static class Entry<K, V> extends HashMap.Node<K,V>{
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K, V> next){
super(hash, key, value, next);
}
}
- LinkedHashMap继承于HashMap,但是并没有覆写put方法,HashMap中每个节点的结构是HashMap.Node,而LinkedHashMap中每个节点的结构是LinkedHashMap.Entry,实现的原理是LinkedHashMap中覆写了newNode的方法。
HashTable
- Key和Value均不能为null
- HashTable是线程安全的,如果不需要线程安全,那么推荐使用HashMap,如果需要高并发线程安全,那么推荐使用ConcurrentHashMap
- HashTable的线程安全是通过添加synchronized关键字来实现的
TreeMap
- 内部使用一颗红黑数来存储数据
- 数据是有序的
* 根据key的比较来排序,因此要求key是实现了Comparable接口 * 在TreeMap的构造函数中显示传入Comparator类 - 内部存储数据的结构是:
static final class Entry<K,V> implements Map.Entry<K,V>{
K key;
V value;
Entry<K,V> left;
Entry<K,V> right;
Entry<K,V> parent;
boolean color = BLCAK;
Entry(K key, V value, Entry<K,V> parent){
this.key = key;
this.value = value;
this.parent = parent;
}
}
EnumMap
- key必须为某一类型的枚举
- key不能为null,value可以为null
- 迭代器的顺序是和key.ordinal()的顺序保持一致
- 内部使用Object[] vals来存储value,value的索引就是key.ordinal()
- 使用K[] keyUniverse来存储所有的枚举值
IdentityHashMap
- key的相等判断条件是k1==k2
- 允许key和value为null
- 使用Object[] table来存储数据,table[i]存储key,table[i+1]存储value
HashSet
- 内部使用HashMap来存储数据,add方法的实现
private static final Object PRESENT = new Object();
...
public boolean add(E e){
return map.put(e, PRESENT) == null;
}
TreeSet
- 内部使用TreeMap来存储数据
ArrayDeque
- 使用Object[] elements来储存数据
- 作为堆栈使用时性能优于Stack;作为队列使用时性能优于LinkedList
PriorityQueue
- 使用Object[] queue来存储数据
- 数据是有序的,按照元素的Comparable来排序,或者Comparator来排序
- 不允许null元素
- 非线程安全,线程安全请使用PriorityBolckingQueue
- 队列的头是排序最小的元素
- 该队列的iterator()迭代器并不能保证以特定的顺序来遍历队列,如果需要以特定的顺序遍历队列,考虑使用Arrays.sort(pq.toAttay())