「数据结构」3.ArrayList
•
数据库
🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!
ArrayList
- 🍉ArrayList的构造
- 🍉add方法
-
- 🍌扩容机制
- 🍌重要结论
- 🍉其他方法
- 🍉遍历ArrayList
🍉ArrayList的构造
有三种构造方法:
| 方法 | 功能 |
|---|---|
| ArrayList() | 无参构造 |
| ArrayList(int initialCapacity) | 指定顺序表初始容量进行构造 |
| ArrayList(Collection c) | 利用其他 Collection 构建 ArrayList |
- 采用无参构造的话,生成的顺序表中的数组是一个空数组,此时我们认为没有分配内存
- 第三种构造方法不太好理解。Collection是集合框架,?是通配符,是通配符泛型,表示可以接收 E 或 E 的子类的集合作为类型形参
ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(list1); //相当于new ArrayList(ArrayList)
比如上面这个代码,构造list2就使用了第三种构造方法,我们拿构造list2的语句和上面的方法进行对照:
list1对应形参c,它的类型为ArrayList,ArrayList是Collection接口的实现类,而Integer是Number的子类(Integer extends Number,E就是Number)
如果你还是不太明白的话,也没关系,能知道怎么用就行了,看下这个例子:
Listlist3 = new ArrayList(list1);
我们可以发现:ArrayList是List的实现类,即List相当于是ArrayList的“父类”(这里是为了方便理解才称为“父类”,但是它和继承中所说的父类不是一回事);而Number就是Integer的父类
也就是说,=左边的泛型类的范围要比右边括号中的大
🍉add方法
| 方法 | 功能 |
|---|---|
| boolean add(E e) | 对e进行尾插 |
| void add(int index, E element) | 将 e 插入到 index 位置 |
| boolean addAll(Collection c) | 尾插 c 中所有元素 |
关于addAll,刚才讲构造方法的时候已经详细讲解了Collection c,所以下面直接看示例:
ArrayList list1 = new ArrayList(); Listlist3 = new ArrayList(list1); list1.add(1); list1.add(2); list1.add(3); list3.addAll(list1); System.out.println(list3);

🍌扩容机制
添加元素时,ArrayList会检查是否需要扩容
- 若需要扩容,初步预估按照1.5倍大小扩容;如果用户所需大小超过1.5倍的大小,则按照用户所需大小扩容(真正扩容之前会检测是否能扩容成功,防止太大导致扩容失败)
- 使用copyof方法进行扩容,将现有的元素逐个复制到新的数组中,然后新的数组取代旧的数组成为ArrayList的内部容器
🍌重要结论
通过查阅源码,我们可以得出以下两个结论,这里更重要的是记住结论,不必刻意去研究源码
结论1:对于add方法,如果顺序表一开始的有效容量为0,那么第一次add时会进行扩容,分配10个类型大小的内存
结论2:ArrayList的扩容是1.5倍扩容
🍉其他方法
下面是一些常用的方法,大部分功能我们都已经在MyArrayList中实现过,在此不多赘述
| 方法 | 功能 |
|---|---|
| E remove(int index) | 删除 index 位置元素(返回被删除的元素) |
| boolean remove(Object o) | 删除遇到的第一个 o |
| E get(int index) | 获取下标 index 位置元素 |
| E set(int index, E element) | 将下标 index 位置元素设置为 element |
| void clear() | 清空ArrayList |
| boolean contains(Object o) | 判断 o 是否在线性表中 |
| int indexOf(Object o) | 返回第一个 o 所在下标 |
| int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
| List subList(int fromIndex, int toIndex) | 截取部分 list(注意区间是左闭右开) |
🍉遍历ArrayList
有三种遍历方式:for循环+下标、foreach、使用迭代器
- for循环遍历
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
for (Integer integer : list) {
System.out.print(integer + " ");
}
}
- 迭代器是一种设计模式,接触更多的容器之后再讲
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/59abf1f4a0.html
