Java集合类型的默认容量以及扩容机制

Java List 扩容机制探究(ArrayList 、Vector、LinkedList) ensureExplicitCapacity方法会调用grow方法,扩容1.5倍,就是在此发生的。ensureCapacityInternal方法会调用ensureExplicitCapacity方法来确保空间,modCount用来多线程的判断,此处不赘述。调试下我们可以发现,虽然elementData进行了扩容,但是实际大小还是元素的个数,别被唬住了。方法,capacityIncrement默认是0,所以等价。初始化会默认调用无参,再调用有参数构造器,空间默认10。这是第二次扩容为,扩容为15。 阅读详情

List相关的默认容量以及扩容机制

ArrayList
  • ArrayList默认容量是10
  • ArrayList最大容量Integer.MAX_VALUE - 8
  • ArrayList扩容机制,按原数组长度的1.5倍扩容。如果扩容后的大小小于实际需要的大小,将数组扩大到实际需要的大小
Vector

Vector是线程安全版的ArrayList内部实现都是用数组实现的。Vector通过在方法前用synchronized修饰实现了线程同步功能
- Vector默认容量是10
- Vector最大容量Integer.MAX_VALUE - 8
- Vector扩容机制,如果用户没有指定扩容步长,按原数组长度的2倍扩容,否则按用户指定的扩容步长扩容。如果扩容后的大小小于实际需要的大小,将数组扩大到实际需要的大小

Stack

Stack继承自Vector。添加了同步的push(E e),pop(),peek()方法,默认容量和扩容机制同Vector
- Stack默认容量是10
- Stack最大容量Integer.MAX_VALUE - 8
- Stack扩容机制,如果用户没有指定扩容步长,按原数组长度的2倍扩容,否则按用户指定的扩容步长扩容。如果扩容后的大小小于实际需要的大小,将数组扩大到实际需要的大小

CopyOnWriteArrayList

CopyOnWriteArrayList是线程同步的数组集合。CopyOnWriteArrayList使用场景主要是多线程环境下,查询、遍历操作明显多于增加、删除操作。
- CopyOnWriteArrayList默认容量是0,从0开始
- CopyOnWriteArrayList没有规定最大容量(适合在查询操作频繁的场景下使用,容量变化不大)
- CopyOnWriteArrayList扩容机制,每次+1

LinkedList

LinkedList是用双链表实现的。对容量没有要求,也不需要扩容

Queue相关的默认容量以及扩容机制

ArrayBlockingQueue

ArrayBlockingQueue是基于数组实现的线程安全的有界队列。它的容量是用户传递进来的。(内部使用ReentrantLock实现线程同步)

ConcurrentLinkedQueue

ConcurrentLinkedQueue是基于单链表实现的线程安全的无界队列。(内部使用CAS实现线程同步是乐观锁)

DelayQueue、PriorityQueue

非线程安全的无界队列。

LinkedBlockingQueue

LinkedBlockingQueue是基于单链表实现的线程安全的无界队列。(内部使用takeLock和putLock读写分离锁实现)

Map相关的默认容量以及扩容机制

HashMap

HashMap是基于数组和链表/红黑树实现的。HashMap的容量必须是2的幂次方(原因是(n-1)&hash是取模操作,n必须是2的幂次方)
- HashMap默认容量是16
- HashMap最大容量2的30次方
- HashMap扩容机制,扩容到原数组的两倍

ConcurrentHashMap

// todo

Hashtable
  • Hashtable默认容量是11(Hashtable默认大小是11是因为除(近似)质数求余的分散效果好:)
  • Hashtable最大容量Integer.MAX_VALUE - 8
  • Hashtable扩容机制,扩容到原数组的两倍+1
LinkedHashMap

继承自HashMap扩容机制同HashMap

TreeMap

TreeMap由红黑树实现,容量方面没有限制

WeakHashMap

同HashMap

Java使用数组实现ArrayList的动态扩容的方法 主要介绍了Java使用数组实现ArrayList的动态扩容的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 484

java杂谈之并发容器

常用容器 前几天和同事xhf、zm走查代码,功能是为了减少频繁你创建FTP开销用线程notify和wait实现了一个FTP池子,当时提的建议就是用java自带的线程集合实现可能更高效,本文整理下JDK自带线程安全的集合,不考虑多线程并发的情况下,容器类一般使用 ArrayList、HashMap 等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBl...

steven2xupt的博客 592

S7-1200 Modbus TCP客户端配置实战:从基础设置到数据交互详解

本文详细介绍了S7-1200 Modbus TCP客户端的配置方法,从基础设置到数据交互的完整流程。涵盖硬件准备、TIA Portal配置、MB_CLIENT指令参数详解、数据缓冲区管理及实战测试,帮助工程师快速掌握西门子PLC与Modbus TCP通信的关键技术。

fire9的博客 311

Java-集合最大容量

一、List最大容量 1、ArrayList:内部是数组,上限是Integer.MAX_VALUE-8 2、LinkedList:内部是链表,理论上无上限 二、Set最大容量 1、HashSet:上限是1 << 30 三、Queue最大容量 1、PriorityQueue:上限是Integer.MAX_VALUE - 8 四、Map最大容量 1、HashMap:上限是1 << 30 但实际应用中都不会这么大,比如List存放的内容在内存中,而虚拟机的内存是有上限的,所以真正计算的应该

zym_1321的博客 9440

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 749

ConcurrentLinkedQueue非阻塞无界链表队列

结果实际是一个减法操作。注意,调用ConcurrentSkipListMap的size时,由于多个线程可以同时对映射表进行操作,所以映射表需要遍历整个链表才能返回元素个数,这个操作是个O(log(n))的操作。值得注意的是,在使用ConcurrentLinkedQueue时,如果涉及到队列是否为空的判断,切记不可使用size()==0的做法,因为在 size()方法中,是通过遍历整个链表来实现的,在队列元素很多的时候,size()方法十分消耗性能和时间,只是单纯的判断队列为空使用isEmpty()即可!

2301_78145678的博客 1354

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

并发容器-ConcurrentLinkedQueue详解

转载自:并发容器-ConcurrentLinketQueue

njitzyd 196

3 ATK2(AUTOSAR OS)代码移植-目标硬件及编译环境简介

该部分介绍ATK2代码移植的目标硬件以及编译环境

xiaoduanduansad的博客 720

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

Java 集合基础超详细整理,从入门到精通

集合是 Java 提供的数据容器,作用和数组一致,都可以用来批量存储多个数据。容器区分:数组长度固定,ArrayList 基于数组实现、支持动态扩容,数据可变场景优先使用集合;泛型使用:创建 ArrayList 建议指定泛型,约束元素类型,保证代码规范与安全;底层原理:默认底层数组长度为 10,存满后自动扩容为原长度 1.5 倍;核心 API:牢记add增、remove删、set改、get查、size获取长度五大方法;内存规则:集合、对象引用存于栈,真实实体存于堆,多方法操作同一集合会共享数据;

mgw1413的博客 351

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2571

【源码】Hashtable源码剖析

注:以下源码基于jdk1.7.0_11 上一篇分析了HashMap的源码,相信大家对HashMap都有了更深入的理解。本文将介绍Map集合的另一个常用类,Hashtable。 Hashtable出来的比HashMap早,HashMap 1.2才有,而Hashtable在1.0就已经出现了。HashMap和Hashtable实现原理基本一样,都是通过哈希表实现。而且两者处理冲突的方式也一

RowandJJ 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

从面试角度分析ArrayList源码

注:本系列文章中用到的jdk版本均为java8ArrayList类图如下:ArrayList的底层是由数组实现的,数组的特点是固定大小,而ArrayList实现了动态扩容。ArrayLi...

架构师小秘圈 255

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一行一行读Java源码——ArrayList

ArrayList可能是日常开发中使用频率最高的集合类型之一(另一个是HashMap),但是有些细节不细究、不常回顾的话总是会慢慢模糊,比如有一语句List&lt;Object&gt; objects = new ArrayList&lt;&gt;();,试问此时objects 的容量(capacity)是多大? 尽管类似这样的细节对代码质量的影响可能不大,但作为Java程序员我们还是有必要去熟悉...

sweetfire的博客 282

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java集合的扩容机制

总结 ArrayList 和Vector默认加载因子都是1(元素满了才扩展容量).默认容量都是10;但是ArrayList 在jdk1.8时默认为空,当添加元素时,才初始化为10个容量。 ArrayList 默认初始容量为10,(jdk8的时候底层Object[] elementData数组初始化为{},并没有创建长度为10的数组。在add元素时才创建了10个容量。) 线程不安全,查询速度快     底层数据结构是数组结构     扩容增量:原容量的 0.5倍,新容量为原容量的1.5倍。     如 Ar

weixin_38568503的博客 9057

【java集合体系中各集合的扩容机制】

在之前提到多数据存储的三种方式:数组、链表、树,它们单独使用时都非常不方便,因此存在一些集合接口提高了多数据存储的能力。集合分为单列集合和双列集合,其下的一些实现类都存在自己的扩容机制,本篇介绍其扩容机制。

m0_54230514的博客 3266

Java常用集合的默认容量以及扩容机制

List相关的默认容量以及扩容机制 ArrayList ArrayList默认容量是10 ArrayList最大容量Integer.MAX_VALUE - 8 ArrayList扩容机制,按原数组长度的1.5倍扩容。如果扩容后的大小小于实际需要的大小,将数组扩大到实际需要的大小 Vector Vector是线程安全版的ArrayList内部实现都是用数组实现的。Vector通过在方法前用...

sunny潘先生的博客 694

Java集合之ArrayList扩容机制

ArrayList的构造函数 //默认初始容量大小(默认能添加10条数据) private static final int DEFAULT_CAPACITY = 10; //默认实例化一个空数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默认构造函数,使用初始容量为10构造一个空列表(无参数构造...

从入门到入狱 1万+

ArrayList扩容机制JDK1.8 (底层原理)

作者在学习过程中,遇到了ArrayList扩容的底层原理这一问题,查看JDK源码后有所理解故写此博客记录下来。 ArrayList简介 ArrayList 是 java 集合框架中比较常用的数据结构。继承自 AbstractList,实现了 List 接口。基于数组实现容量大小动态变化。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayL...

ZhzZhi的博客 6659

Java常见集合扩容机制

所谓扩容,即当前集合能容纳的数据量达到一个饱和状态 (饱和状态和加载因子有关)之后, 集合需要申请新的存储空间 。 常见的需要扩容的集合 一般是底层基于数组实现 的 ,链表不涉及扩容问题。 加载因子的系数小于等于1,当元素个数超过容量长度*加载因子的系数时,进行扩容。 另外,不同的集合容器,扩容的机制也不同。 一、List接口实现类(ArrayList,Vector)扩容详解 ArrayList: 底层为Object数组 默认容量:0(在jdk1.8以前,ArrayList默认容量是10,从jdk1.8开始

淮宁湾的博客 1919

Java中集合的默认容量与扩容机制

Java中集合的默认容量与扩容机制 转自https://www.cnblogs.com/xiezie/p/5511840.html 当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低。 加载因子系数小于等于1,当元素个数 超过 容量长度*加载因子系数 时,进行...

qq_39051619的博客 406

深入理解 Java 集合扩容机制:从原理到实践

本文深入解析了Java集合的扩容机制,聚焦于ArrayList和HashMap这两种常用集合。对于ArrayList,阐述了其基于动态数组的实现,包括初始化方式、扩容触发条件(元素数量超数组容量)及核心逻辑(默认扩容1.5倍、数组复制等),并指出了扩容成本与优化建议。对于HashMap,介绍了容量、负载因子、阈值等核心概念,分析了扩容触发条件(元素超阈值或链表长度达标且容量不足),详解了JDK 1.8下的扩容步骤(计算新容量、重新计算阈值、数据迁移等),还对比了JDK 1.7与1.8的扩容差异。此外,提及了

Java是世界上最好的语言 1124
上一篇: JVM 运行时数据区域简介
下一篇: Java命令行参数详解
字节小站
博客等级 码龄10年 53粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值