1.Collection
set
HashSet
list
ArraryList
object数组
初始化时,若未指定数组大小则指向一个空数组
add()方法
若数组是空,则指定当前容量为10
若当前容量(数组大小+1)大于数组大小,则扩容 int newCapacity = 数组大小 + (数组大小 >> 1),扩容为原来的1/2倍,elementData = Arrays.copyOf(elementData, newCapacity)复制新数组
最后, elementData[size++] = e;
get()方法
rangeCheck(index);
return elementData(index);
remove(int index) 方法
int numMoved = size - index - 1;
System.arraycopy(elementData, index+1, elementData, index,numMoved);
elementData[--size] = null;
把elementData[index]删除,后面的数据前移,最后个=null
clear()方法
数组全为null,size=0
LinkedList
双向链表
private static class Node
E item;
Node
Node
Node(Node
this.item = element;
this.next = next;
this.prev = prev;
}
}
add(E e) 方法
void linkLast(E e) {
final Node
final Node
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
将last节点指向新增节点
clear() 方法
从first节点开始,各个节点设置null
Vector
同步的ArraryList,它的扩容可以在初始化的时候自己指定,Vector(int initialCapacity, int capacityIncrement)
Object[] elementData
2.Map
HashMap
Entry
Entry(int h, K k, V v, Entry
value = v;
next = n;
key = k;
hash = h;
}
初始化时可以指定容量大小和扩容因子,默认16,0.75
put(K key, V value)方法
如果table是空,则初始化table数组,threshold=16*0.75
如果key=null,则放在table[0]中
根据key做hash运算,得到hash值,然后h & (length-1);得到table下标,遍历单链表根据
e.hash == hash && ((k = e.key) == key || key.equals(k)判断key是否存在
如果不存在,则添加,首先判断size是否大于等于threshold且所在的table不为空,则扩容table为table.length的2倍,会将oldtable的值重新hash,所以会消耗很多时间,因此在初始化的时候尽量指定容量大小。
get(Object key)方法
根据key计算出hash和table下标,根据e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k)))判断是哪个entry
remove(Object key)方法
和get方法一样,定位到哪个entry,然后操作next节点删除
clear() 方法
将循环table设置null
Hashtable
和hashMap一样,也是Entry
public Hashtable() {
this(11, 0.75f);
}
synchronized V put(K key, V value) 方法,value==null会抛异常
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
遍历Entry,如果key已经存在则返回(e.hash == hash) && e.key.equals(key)
如果count()>=threshold,则重新hash,int newCapacity = (oldCapacity << 1) + 1;将之前的值放入新数组中Entry
synchronized V get(Object key)方法
根据key做hash,并计算出table的index,判断e.hash == hash) && e.key.equals(key),得到value或者null
synchronized void clear()方法
把table的所有的entry=null
synchronized V remove(Object key)
设置next的节点值
TreeMap
TreeMap的内部结构是Entry
static final class Entry
K key;
V value;
Entry
Entry
Entry
boolean color = BLACK;
}
put(K key, V value)方法
根据自定义的comparator接口或者Comparable从根节点开始循环比较key,如何key存在则覆盖,若不存在,新建一个 Entry
clear()方法
size = 0;
root = null;
LinkedHashMap
LinkedHashMap继承了HashMap,它用Entry
3.工具类
Collections
void sort(List
oid copy(List super T> dest, List extends T> src),复制集合
void fill(List super T> list, T obj) , obj填充
reverse(List> list)倒序
Map
Arrays
boolean equals(long[] a, long[] a2)
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
4.concurrent集合
ConcurrentHashMap
ConcurrentLinkedQueue
CopyOnWriteArrayList
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue