一、扩容
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. 有序,先添加的元素在后添加的元素前面