文章目录
一、ArrayList的简单使用
- ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
- ArrayList实现了Cloneable接口,表明ArrayList是可以clone的 3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
- 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者
CopyOnWriteArrayList - ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
1.ArrayList的构造
ArrayList<Integer> arrayList1 = new ArrayList<>();
2.ArrayList的常规操作
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list= new ArrayList<>();
ArrayList<String> arrayList1 = new ArrayList<>();
arrayList1.add("JavaSE");
arrayList1.add("JavaEE");
arrayList1.add("JavaWeb");
arrayList1.add("JVM");
System.out.println(arrayList1);
System.out.println("===========");
//获取元素长度
System.out.println(arrayList1.size());
System.out.println("===========");
//获取和设置相应位置的元素
System.out.println(arrayList1.get(2));
arrayList1.set(2,"JAVAWEB");
System.out.println(arrayList1.get(2));
System.out.println("===========");
//在指定位置插入相应元素并让其他元素后移
System.out.println(arrayList1);
arrayList1.add(2,"数据结构");
System.out.println(arrayList1);
System.out.println("===========");
// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
arrayList1.remove("JVM"); System.out.println(arrayList1);
System.out.println("===========");
// 使用list中[1,3)之间的元素构成一个新的ArrayList返回
List<String> list1 = arrayList1.subList(1,3);
System.out.println(list1);//2,3
}
}
3.ArrayList的遍历
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
二、ArrayList的扩容机制
首先,我们先构造出一个不含任何参数的顺序表
public class Test {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
}
}
我们可以进入源码中查看 ArrayList 如图:
这里还看不出什么,我们在继续深入源码,我将他们截取后如图所示:
在观察上述代码后不难发现在我们没有存放任何元素时
这里,元素个数为0,呢么 elementData 的值也为0,也就没有分配内存。
呢么add储存时为何没有出现错误?让我们继续分析。
我们进入 add 的源码
我们再进入 ensureCapacityInternal
在这里我们能知道 minCapacity 的值大小为 1 继续深入
这里 if 语句可以进入进行最大值判断,并返回最大值
我们还需要在进入 ensureExplicitCapacit 方法
如图
最后进入 grow 方法
最终分配到了10个大小的内存空间
注:这里的 oldCapacity>>1 是除2的意思
整体的逻辑分析图如下