集合的分类和区别,扩容机制,底层原理

集合的分类和区别

在这里插入图片描述

集合的扩容机制

Vactor:初始容量10,加载因子1,扩容机制是原容器的2倍。
ArrayList:初始容量10,加载因子1,扩容机制是原容量的1.5倍。
hashtable:初始容量11,加载因子0.75,扩容机制是原容量的2倍+1。
hashMap:初始容量16,加载因子0.75,扩容机制是原容器的2倍。
HashSet :初始容量16,加载因子0.75,扩容机制是原容器的2倍。

集合的底层原理

Vector:底层数据结构是数组,线程安全。
ArrayList:底层数据结构是数组查询快(地址连续)、增删慢、线程非安全。
LinkedList: 底层数据结构是链表(双向链表)、查询慢、增删快、无索引、线程非安全。。
HashSet:底层数据结构是哈希表(无序,唯一),通过hashcode()和equals()保证元素唯一。
LinkedHashSet:底层数据结构是链表和哈希表。
TreeSet:底层数据结构是红黑树(是一个自平衡的二叉树),通过自然排序和比较器排序保证元素有序,根据比
较返回值是否是0来保证元素唯一性。
HashMap:底层数据结构是数组+链表+红黑树。
Hashtable:底层数据结构是数组+链表。

### Java 集合底层实现原理之动态扩容机制 #### ArrayList 扩容机制 `ArrayList` 是基于数组实现的列表结构,在初始化时会创建一个固定大小的对象数组 `elementData`。当向 `ArrayList` 中添加元素而现有容量不足以容纳新的元素时,就会触发扩容操作。 默认情况下,`ArrayList` 的初始容量为10[^3]。一旦实际使用的元素数量超过了当前容量,`ArrayList` 就会自动调整其内部存储空间: - 新容量通常是旧容量的1.5倍加上1(即 `(oldCapacity * 3/2) + 1`),以确保有足够的额外空间来减少频繁的内存分配。 - 如果指定的新容量小于最小增长量,则直接采用最小增长量作为新容量。 - 当前版本还支持通过构造函数自定义初始容量以及最大容量限制。 ```java // 增加容量的方法 private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 计算新容量 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); } ``` #### HashMap 扩容机制 对于 `HashMap` 而言,其扩容逻辑更为复杂一些。每当表中的条目总数超过负载因子与桶位数乘积所决定的阈值时,便会启动扩容流程[^5]。具体表现为: - 容量翻倍:每次扩容都会使哈希表的实际长度变为原来的两倍; - 数据迁移:所有已有的键值对会被重新计算散列码并放置到新的位置上; - 特殊处理:在某些特定条件下还会涉及到红黑树转换等高级特性; 值得注意的是,在 JDK 8 及之后版本中,`HashMap` 对扩容时机做了优化——只有在真正需要插入新节点而非更新已有节点的情况下才会考虑是否要执行扩容动作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值