《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a wi
n:
elementData = Arrays.copyOf(elementData, newCapacity);
}
=====================================================================
Vector 比 ArrayList 多了一个属性:
这个属性是在扩容的时候用到的,它表示每次扩容只扩 capacityIncrement 个空间就足够了。该属性可以通过构造方法给它赋值。先来看一下构造方法:
protected int capacityIncrement;
// 初始化容器大小,和每次扩容大小
public Vector(int initialCapacity, int capacityIncrement)
{
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacit
y: "+initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
//初始化容器大小
public Vector(int initialCapacity) {
this(initialCapacity, 0);
尚硅谷 Java 高级编程 宋红康
}
//无参构造初始化容量为10
public Vector() {
this(10);
}
简单总结一下:这三种构造方法
-
无参构造
-
可以设置初始化容量
-
也可初始化容量和每次扩充的大小
从构造方法中,我们可以看出 Vector 的默认大小也是 10,而且它在初始化的时候就
已经创建了数组了。
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement >
- ? capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
如果指定了扩容的大小( capacityIncrement),则按照指定的大小进行扩容。
如果没有指定扩容的大小,则每次扩容为之前的两倍。
======================================================================
//默认的初始容量为 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//最大的容量上限为 2^30
static final int MAXIMUM_CAPACITY = 1 << 30;
//默认的负载因子为 0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
尚硅谷 Java 高级编程 宋红康
//变成树型结构的临界值为 8
static final int TREEIFY_THRESHOLD = 8;
//恢复链式结构的临界值为 6
static final int UNTREEIFY_THRESHOLD = 6;
//当哈希表的大小超过这个阈值,才会把链式结构转化成树型结构,否则仅采取扩容来尝试减少冲突
static final int MIN_TREEIFY_CAPACITY = 64;
长活短说:
-
初始化默认容量为16
-
扩容阈值为0.75,意思就是每次达到现在容量的0.75倍是就进行扩容(此处不是占用桶的个数,而是键值对的数量)
-
如果需要扩容,变为原来容量的两倍
-
如果一个桶中的链表长度超过8,并且哈希表的容量大于64时,则转换为树结构
-
如果树的深度地于6则又转换为链式结构
========================================================================
构造器
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}
public Hashtable() {
this(11, 0.75f);
}
默认容量为11,扩容的阈值为0.75
//扩容扩为原来的两倍+1
本次面试答案,以及收集到的大厂必问面试题分享:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
this(11, 0.75f);
}
默认容量为11,扩容的阈值为0.75
//扩容扩为原来的两倍+1
本次面试答案,以及收集到的大厂必问面试题分享:
[外链图片转存中…(img-nB8pRfWE-1714410777691)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!