ArrayList、HashMap等集合初始容量的大小以及扩容的倍数

《一线大厂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

=====================================================================

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 >

  1. ? capacityIncrement : oldCapacity);

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

elementData = Arrays.copyOf(elementData, newCapacity);

}

如果指定了扩容的大小( capacityIncrement),则按照指定的大小进行扩容。

如果没有指定扩容的大小,则每次扩容为之前的两倍。

HashMap

======================================================================

//默认的初始容量为 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则又转换为链式结构

HashTable

========================================================================

构造器

public Hashtable(int initialCapacity) {

this(initialCapacity, 0.75f);

}

public Hashtable() {

this(11, 0.75f);

}

默认容量为11,扩容的阈值为0.75

//扩容扩为原来的两倍+1

本次面试答案,以及收集到的大厂必问面试题分享:

字节跳动超高难度三面java程序员面经,大厂的面试都这么变态吗?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
this(11, 0.75f);

}

默认容量为11,扩容的阈值为0.75

//扩容扩为原来的两倍+1

本次面试答案,以及收集到的大厂必问面试题分享:

[外链图片转存中…(img-nB8pRfWE-1714410777691)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值