ArrayList

一、扩容

1. 检查容量

2. 如果不够,新建一个更长的数组

3. 把老的数据,使用Arrays.copyOf方法,拷贝到新的数组

4. 引用指向新的数组

二、ArrayList使用场景

1. 尾部插入操作,如果不扩容,效率很高;但是在指定位置插入元素,后面的元素需要移动,效率很低

2. 尾部删除操作,效率很高;但是在指定位置删除元素,效率很低

3. 如果插入时扩容,会调用System.arrayCopy()方法,拷贝数组效率低

4. 所以ArrayList适合读数据比较多,不会频繁插入和删除的场景

5. 插入和删除操作比较频繁的情况下,使用LinkedList,因为链表不适合访问,而适合插入和删除

三、安全

1. 当做参数时,需要考虑原始的arrayList会不会改变

2. 可以把参数做一个拷贝,方法里使用这个拷贝

四、复制

1. clone()方法,浅拷贝

2. 构造方法,把另一个ArrayList当做参数传入,浅拷贝

3. Collection的copy方法,深拷贝

五、subList

1. 截取list的一部分,返回list

2. 不可强制转换为ArrayList,否则会报错

3. subList返回的是一个视图,并没有重新定义一个List,而是返回了原来ArrayList的一部分

4. SubList是ArrayList的一个内部类,他们没有继承关系,强制转换会报错

5. 结构不改变:更新了subList里的某个元素,原来的ArrayList里的相对应的元素也会改变;反之一样

6. 结构改变:

a. 增删了subList里的某个元素,原来ArrayList的对应的元素也会改变

b. 增删了原来ArrayList的元素,会报异常ConcurrentModificationException

7. 可以创建subList的拷贝,然后试用这个拷贝,就不影响原来的ArrayList了

六、特性

1. 元素类型是引用类型,基本类型会自动转换成引用类型

2. 有序,先添加的元素在后添加的元素前面

原文地址:https://www.cnblogs.com/june0816/p/6575232.html