四、ArrayList底层源码详解-创新互联
文章目录
菜鸟教程ArrayList讲解
成都创新互联于2013年创立,是专业互联网技术服务公司,拥有项目成都网站设计、
成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元江津做网站,已为上家服务,为江津各地企业和个人服务,联系电话:18980820575特点
- 可以加入控制null(可加入多个)
- 底层是数组实现的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码(没有synchronized),在多线程情况下,不建议使用ArrayList
- ArrayList中维护了一个0bject类型的数组elementData
- 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
底层源码分析
创建
无参构造器
ArrayList list = new ArrayList();底层的实现方式
有参构造器
ArrayList list = new ArrayList(8);底层实现
传入集合的有参构造器
- elementData = c.toArray():将c对象转换成数组赋值给elementData
- 然后判断内容是否为空,为空的话就直接赋值一个空数组
- 不为空的话需要判断elementData是不是一个Object[].class,(因为c.toArray()是转换成数组赋值给elementData,而elementData里面添加的元素都是以Object[].class添加进去的),所以如果不是Object[].class类就转换成Object[].class类。
也就说明,无参构造器,一开始得到的集合是空的
扩容
list.add(new Book(“红楼梦”,30,“曹雪芹”));底层的实现
首先走到这里
- E e:表示添加数据时传进来的数据
- ensureCapacityInternal(size + 1):判断是否需要扩容(无参构造器一开始未初始化size,java中默认为0)
- elementData[size++] = e:add是在最后添加数据
然后再进入ensureCapacityInternal(size + 1)判断是否需要扩容
进入calculateCapacity(Object[] elementData, int minCapacity)确定扩容的容量
- DEFAULTCAPACITY_EMPTY_ELEMENTDATA:空数组
- DEFAULT_CAPACITY常量10
- minCapacity:数组添加完这个数据时的容量
再进入这个方法,确定添加数据
- modCount:记录添加次数(防止多线程同时修改)
- if (minCapacity - elementData.length >0):判断当前内容和数组容量大小,如果数组容量够就没必要扩容
最后才进行扩容
注意new ArrayList(0)
若有参构造时,传的数据是0,那么,扩容还是会按照0扩容,不会按照无参时考虑是否大于10,来扩容。即扩容后elementData数组容量依次为0、newCapacity=1、newCapacity=2、newCapacity=(2+2/2)=3、newCapacity=(3+3/2)=4,newCapacity=(4+4/2)=6,即第六次添加数据不扩容,第七次添加还用扩容…
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文标题:四、ArrayList底层源码详解-创新互联
分享URL:
http://dzwzjz.com/article/cdeego.html