ArrayList扩容机制
ArrayList
ArrayList实现了List接口。它是一个可调整大小的数组,可以用来存放各种形式的数据。并提供了包括CRUD在内的多种方法可以对数据进行操作,但是它不是线程安全的。
ArrayList扩容机制:
List扩容实现步骤总的来说就是分两步:
- 扩容: 把原来的数组复制到另一个内存空间更大的数组中
- 添加元素: 新元素添加到扩容以后的数组中
数组定义的时候,因为需要给它分配连续的内存空间,需要预先指定其大小。因此当存放的数据大于其大小的时候,我们需要从新分配一块更大的空间,把原来的复制过去在插入新的元素。
在ArrayList中,当空间不够用的时候,它会自动扩容为原来的1.5倍的大小。
因为扩容设计到内存的申请和数据的搬移,这是比较耗时的,所以,如果事先能确定数据的大小,做好在创建ArrayList的时候指定其大小。
虽然ArrayList比数组好用,不过有些时候使用数组会更好一些,原因如下:
- ArrayList无法存储基本类型,int long等需要封装成Integer,Long类,而自动装箱和拆箱的操作也会有一定的性能消耗,所以如果关注性能或者想用基本类型就选用数组。
- 如果数据的大小已经知道,并且对数据的操作简单,可以直接使用数组。
- 当使用多为数组的时候,用数组表示起来更加直观比如int[][]arr;而用容器的话则需要这样定义ArrayList arr。