ArrayList
使用注意点:初始化的时候,若能够大概预测存多少,就给个大概值。否则也给个默认值,比如10.
看源码
// 无参构造器
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 有参构造器
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);
}
}
看扩容方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// TODO 重点是 grow方法
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);
}
int newCapacity = oldCapacity + (oldCapacity >> 1);
如果你初始化容量是10,扩容到 1000,需要13次。
要调用: 13次。 Arrays.copyOf(elementData, newCapacity);
严重将要导致OOM。
HashMap
注意:在使用的时候,也要建立给个初始化值。避免reHash问题。
特别注意:多线程情况下要使用ConcurrentHashMap。多线程下HashMap是有问题的,具体看google。
JDK1.7 的put和1.8的差别挺大。
JSONArray
用的是ArrayList。
public JSONArray(){
this.list = new ArrayList<Object>();
}
所以使用的时候,要注意,初始化容量的问题。