ArrayList是我们最常用的类集框架之一,它的本质是一个数组,有时候我们也把它称为动态数组,但是这个”动态”只是表象,因为数组的大小是不能扩大或缩小的,数组的大小在数组被创建的时候就已经确定了。
所谓”动态”其实是在要向ArrayList中新增元素但是数组容量已经满了的时候,会创建一个更大的数组然后将原数组的内容拷贝到新创建的数组中,这里也可以称为”扩容”,所以扩容是非常耗费时间以及内存的,下面我用图的方式演示一下这个过程。
创建一个默认长度的ArrayList
如果没有设置容量大小(initialCapacity),即调用无参构造new ArrayList()创建ArrayList,默认的容量为10
我们通过add()方法添加的元素其实都是存在这样的一个数组里面,但是如果添加元素的时候数组满了怎么办呢?
从这个图中我们可以看的出来,默认的数组大小是10,添加了j之后数组就已经满了,当添加k的时候就会去判断数组是否满了(其实每一次添加元素的时候都会去判断,只不过只有数组满了的时候才会扩容),如果数组满了,就会创建一个更大的数组(原数组1.5倍的大小),然后将原数组的内容拷贝到新数组中,之后再添加k。
刚才的例子是创建的一个默认长度的ArrayList,创建一个自定义长度的ArrayList也是一样的道理,这里需要重点说明的是图中的数组的长度不是我们平时使用的那个ArrayList.size()那个长度,size属性是ArrayList中实际元素的数量,第一张图就能很清楚的区分这两者的区别,创建的默认长度的ArrayList的数组长度是10,但是size属性是0。
我们弄清楚了ArrayList的一些实现原理,现在我们就来思考一下我们的主题ArrayList初始化容量有什么作用或者说意义呢?
刚才我们也说了,数组扩容是一个非常耗费时间以及内存的操作,特别是数据量大的时候,举一个例子,现在我需要查询一个用户列表,数据量大概在100的样子,然后把数据装到一个ArrayList中,下面我们用两种方式去做这个事情:
- 默认容量的ArrayList:默认容量为10,要存放100+条数据,也就是意味着至少需要扩容6次(15,22,33,49,73,109)
- 自定义容量的ArrayList:设置初始容量为100(即创建一个长度为100的数组),要存放100+条数据只需要扩容一次
如果数据量比较小,在几百几千的范围内,确实影响不大,可能响应时间都是在微秒级,但是如果数据量很大的情况下就很有必要了,试想如果有几百万或者上千万条数据进行扩容操作就非常地消耗时间和内存了。
如果知道ArrayList要存储的数据量的大小的范围,最好给ArrayList设置一个初始的容量,但是也不要过大,因为这样就浪费了不必要的存储空间,这个就看具体的情况了,对时间要求高一些还是对存储要求高一些
今天的文章ArrayList初始化容量对性能的影响分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9934.html