浅聊ArrayList
Posted admiraldeworm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅聊ArrayList相关的知识,希望对你有一定的参考价值。
1.底层结构是什么?
结构是Object[ ]的数组
来扒一扒源码:Tips:看源码,主要看核心参数、核心构造方法、核心方法
1.1核心参数:
1.2核心构造方法:
看它的无参构造可知给存储数据的数组elementDate设置了一个空数组(初始容量是0)
1.3看添加的方法:
先进ensureCapacityInternal()方法最后再存值:
elementDate[size++] = e;//它数组的下标位置是一个一个往后加的所以arrayList数组是有序的;它没有对值做任何判断所以是可重复的
1.4进入ensureCapacityInternal:
在容量超过了数组长度的时候执行扩容方法grow():
1.5进入grow:
0+0*二分之一就是扩容的大小
2、初始容量是多少?
JDK1.8之后包含1.8,初始容量是0;在第一次执行add方法时就会存在初始值 初始容量为10
new 一个arraylist它的数组长度是0
**小tips:**JDK1.6之前包含1.6,初始容量是10
3、何时扩容?
第一次扩容就是在第一次执行add的时候,初始容量为10
第二次扩容:在存储第11个值的时候扩容,扩容大小为1.5倍 15
第三次扩容:在存储第16个值的时候扩容,22(int类型的取整)
**小tips:**JDK1.5的时候arrayList扩容是1.5倍+1
4、为什么查询快,增删改慢?
查询快:这和它的结构有关系,数组是一个连续的存储空间,因为是连续的所以查询的时候通过下标去找,只需找一次就行
增删改慢:在删除一个数时,需要把后面的元素全部前移,同理在增加一个数时,需要把它后面的元素全部后移,所以速度慢
但是这不是绝对的,在按正常顺序的增加时和删除最后一个元素时,速度也很快
小结:顺序新增速度很快,随机插入效率很低
5、一个小面试题
解决方法:
6、一个没有营养的问题:
为什么初始长度大小是10?
官方回答:因为1太小,100太大,所以取了个10;翻译一下就是:没有为什么,就是“感觉”10挺好的,不大不小,刚刚好,眼缘!
以上是关于浅聊ArrayList的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot入门教程:浅聊POJO简单对象(VODTOEntity)