码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合之ArrayList

时间:2019-12-06 00:40:34      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:方法   根据   总结   tcap   安全   random   zab   strong   serial   

一、基础

  ArrayList不是线程安全的,多线程建议使用Vector或者CopyOnWriteArrayList;

  底层实现是Object数组。默认容量DEFAULT_CAPACITY为10,最大数组大小MAX_ARRAY_SIZE为Integer.MAX_VALUE-8;

  实现了RandomAccess接口,表明可以快速随机访问;

  实现了Cloneable接口,表明能被克隆;

  实现了Serializabble接口,表明能序列化之后传输;

二、源码方法

  //TODO

三、扩容

  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)方法先手动扩容

Java集合之ArrayList

标签:方法   根据   总结   tcap   安全   random   zab   strong   serial   

原文地址:https://www.cnblogs.com/yanghanwen/p/11992655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!