Java集合之ArrayList
2019-12-05 16:01:14来源:博客园 阅读 ()
Java集合之ArrayList
一、基础
ArrayList不是线程安全的,底层实现是Object数组。默认容量DEFAULT_CAPACITY为10.
二、
三、扩容
ArrayList初始大小为0,在添加第一个元素的时候,调用add方法,进入add方法时,需要先确定容量足以放下这个元素
进入ensureCapacityInternal()方法,传入值为(当前size+1),然后判断当前数组是否为默认的空数组,满足条件,则最小扩容需要值为(当前size+1)和默认容量中较大的一个值。不是默认的空数组,则最小扩容需要值为(当前size+1)大小
然后进入ensureExplicitCapacity()方法,传入最小扩容需要值,然后判断最小扩容需要值和当前对象数组的长度,如果最小扩容需要值大于当前的数组长度,则调用grow()方法进行扩容
扩容时,暂定扩容值大小为原大小+原大小右移一位(偶数的1.5倍,奇数-1的1.5倍),记为newCapacity,然后判断暂定扩容值和最小容量需要值,扩容值两者中较大值。然后再比较扩容值和数组容量最大值,如果超过了数组容量最大值,再进入hugeCapacity()进入特殊处理。
hugeCapacity()方法中,先判断最小扩容需要值是否为负数,是的话,则抛出内存溢出错误。否则判断最小扩容需要值和Integer的最大值-8比较,再确定最终的扩容值,减去的8位存放的是数组的长度
确定了扩容值之后,就进行扩容操作,根据扩容值新建数组,然后拷贝数组,数组拷贝时调用的是本地方法 System.arraycopy() ,在C语言方法中调用frenn()释放了原数组。
总结:
自动扩容不易,在新建ArrayList时,可以指定大小,或者在新增大量元素之前,可以调用ensureCapacity(int minCapacity)方法先手动扩容
原文链接:https://www.cnblogs.com/yanghanwen/p/11992655.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash