ArrayList注意事项
ArrayListDetail.java
- permits all elements, including null ,ArrayList 可以加入null,并且多个;
- ArrayList是由数组来实现数据存储的;
- ArrayList 基本等同于Vector,除了 ArrayList是线程不安全(执行效率高)看源码.,在多线程情况下,不建议使用ArrayList
package com.List_;
import java.util.ArrayList;
/**
* @author pengyang
* @date 2022-06-07 14:21
*/
public class ArrayListDetail {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
//ArrayList是线程不安全的,在源码中可以看到,没有synchronized
// public boolean add(E e) {
// ensureCapacityInternal(size + 1); // Increments modCount!!
// elementData[size++] = e;
// return true;
// }
}
}
ArrayList扩容机制
ArrayList的底层操作机制源码分析(重点,难点.)ArrayListSource.java ,先说结论,在分析源码(示意图)
-
ArrayList中维护了一个Object类型的数组elementData.[debug看源码]
transient Object[] elementData; //transient表示瞬间,短暂的,表示该属性不会被序列化 -
当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
-
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
源码debug
package com.Collection_.List_;
import java.util.ArrayList;
/**
* @author pengyang
* @date 2022-06-07 14:48
*/
public class ArrayListSource {
public static void main(String[] args) {
//使用无参构造器创建ArrayList
//ArrayList list = new ArrayList();
ArrayList list = new ArrayList(8);
for (int i = 0; i <= 10; i++) {
list.add(i);
}
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}