结论:
类名 | 增长速率 | 初始值 |
---|---|---|
ArrayList | 1.5x+1 | 默认10 |
Vector | 2x | 默认10 |
HashTable | 2x+1 | 默认11 |
HashMap | 2x | 默认16 |
StringBuffer | 2x+2 | 默认16 |
StringBuilder | 2x+2 | 默认16 |
`StringBuffer、StringBuilder默认初始化是16个字符,默认增容为(原长度+1)*2,代码如下:
//默认初始化大小
public StringBuilder() {
super(16);
}
// 默认扩容
int newCapacity = (value.length + 1) * 2;
ArrayList、Vector、HashMap、HashTable是如何扩容的
1. ArrayList,默认初始10个大小,每次扩容是原容量的一半,具体代码如下:
public ArrayList() {
this(10);
}
int newCapacity = (oldCapacity * 3)/2 + 1;
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
2. Vector,默认初始10个大小,每次扩容是原容量的两倍,具体代码如下:
public Vector() {
this(10);
}
int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2);
3. HashMap默认初始16个大小(必须是2的次方),默认每次扩容的因子为0.75,具体代码如下:
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
resize(2 * table.length);
4. HashTable默认初始11个大小,默认每次扩容的因子为0.75,具体代码如下:
public Hashtable() {
this(11, 0.75f);
}
int newCapacity = oldCapacity * 2 + 1;`