ThreadLocal
精华1
每个线程对应一个 threadLocalMap (threadLocal的公共内部类)
t.threadLocals = new ThreadLocalMap(this, firstValue);
//this就是key 就是自己声明的threadlocal
threadLocalMap的key是 自己声明的 threadlocal; 也就是说每个线程的threadLocalMap的key是一样的,但是threadLocalMap不一样;
精华2
threadLocalMap里面有entry[] ;能存放多个threadLocal; 也就是说一个线程上下文中可以声明多个threadLocal 初始大小16个
int i = key.threadLocalHashCode & (len-1); // 定位当前threadLocal在entry[]的index;
if (k == key) { //遍历entry[], 只要数组中的threadLocal和传过来的threadLocal相等就设置值
e.value = value;
return;
}
ArrayList
public ArrayList() {
// 直接将空数组赋给elementData
this.elementData = {}
}
2 扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
3 toArray
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
实际是
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
4 modCount
private class Itr implements Iterator<E> {
int expectedModCount = modCount;//迭代过程不运行修改数组,否则就抛出异常
}
expectedModCount的初值为modCount
hasNext的判断条件为cursor!=size,就是当前迭代的位置不是数组的最大容量值就返回true
next和remove操作之前都会先调用checkForComodification来检查expectedModCount和modCount是否相等
private class SubList extends AbstractList<E> implements RandomAccess {}