🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇**欢迎点赞收藏加关注哦!*
ArrayList
- 🍉ArrayList的构造
- 🍉add方法
- 🍌扩容机制
- 🍌重要结论
- 🍉其他方法
- 🍉遍历ArrayList
🍉ArrayList的构造
有三种构造方法:
方法 | 功能 |
---|---|
ArrayList() | 无参构造 |
ArrayList(int initialCapacity) | 指定顺序表初始容量进行构造 |
ArrayList(Collection<? extends E> c) | 利用其他 Collection 构建 ArrayList |
- 采用无参构造的话,生成的顺序表中的数组是一个
空数组
,此时我们认为没有分配内存 - 第三种构造方法不太好理解。
Collection
是集合框架,?
是通配符,<? extends E>
是通配符泛型,表示可以接收 E 或 E 的子类的集合作为类型形参
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Number> list2 = new ArrayList<>(list1); //相当于new ArrayList<>(ArrayList<Integer>)
比如上面这个代码,构造list2就使用了第三种构造方法,我们拿构造list2的语句和上面的方法进行对照:
list1对应形参c,它的类型为ArrayList,ArrayList是Collection接口的实现类,而Integer是Number的子类(Integer extends Number,E就是Number)
如果你还是不太明白的话,也没关系,能知道怎么用就行了,看下这个例子:
List<Number>list3 = 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<? extends E> c) | 尾插 c 中所有元素 |
关于addAll,刚才讲构造方法的时候已经详细讲解了Collection<? extends E> c,所以下面直接看示例:
ArrayList<Integer> list1 = new ArrayList<>(); List<Number>list3 = 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< E> subList(int fromIndex, int toIndex) | 截取部分 list(注意区间是左闭右开) |
🍉遍历ArrayList
有三种遍历方式:for循环+下标
、foreach
、使用迭代器
- for循环遍历
public static void main(String[] args) {ArrayList<Integer> 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 + " ");}
}
- 迭代器是一种设计模式,接触更多的容器之后再讲