ArrayList:
Object[] 数组实现
default_capacity = 10
扩容: newCapacity = oldCapacity + (oldCapacity >> 1), 最大值为Integer.MAX_VALUE
modCount: 用于迭代器的并发修改检查, 迭代过程中若发现其他线程修改了链表,抛出ConCurrentModificationException
LinkedList:
没有什么特别要记的
HashMap:
数组 + 链表 + 红黑树(jdk1.8)
default_capacity = 1 << 4
terrfiy_threshold = 8, 超过此值链表转为红黑树
loadFactor = 0.75
插入位置:table[(h = hash(Object o)) & capacity - 1]
扩容: 2倍, 发生在size超过threshold(capacity * loadfactor)
扩容后重hash: 对于某条链表上的node来讲, 新位置有两种情况: if e.hash & oldCapacity == 0,newPosition = oldPosition; else newPosition = oldPosition + oldCapacity;
LinkedHashMap extends HashMap:
Entry extends Node,在Node基础上添加了before,after指针,维护一条带头尾结点的双向链表,链表有两种顺序:访问顺序,最近访问的在链表尾部; 插入顺序
PriorityQueue:
Object[]数组 + 最大堆实现
对于队列数据要求数据自身实现Comparable接口,或者创建队列时传入Comparator,目的都是为了可以对数据进行比较
插入数据时, 先插到最后, 然后siftUp调整堆, 取出数据时,移除堆顶数据,然后将最后一个数据放置堆顶,siftDown调整堆
扩容: newCapacity = oldCapacity + (oldCapacity < 64) ? (oldCapacity + 2) : (oldCapacity >> 1)
ThreadLocal<T>:
Thread内部维护一个ThreadLocalMap对象, 这个Map的key是ThreadLocal, 值是线程需要存的数据。ThreadLocal其实就是线程的管家,所有线程私有的东西都可以交给它来管理。如果碰到共享的数据,那么ThreadLocal可以为线程保存一份私有副本,这样就可以避免使用锁而提高性能了。
网友评论