「数据结构」3.ArrayList

个人主页:Ice_Sugar_7
所属专栏:Java数据结构
**欢迎点赞收藏加关注哦!*

ArrayList

  • ArrayList的构造
  • add方法
    • 扩容机制
    • 重要结论
  • 其他方法
  • 遍历ArrayList

ArrayList的构造

有三种构造方法:

方法 功能
ArrayList() 无参构造
ArrayList(int initialCapacity) 指定顺序表初始容量进行构造
ArrayList(Collection c) 利用其他 Collection 构建 ArrayList
  • 采用无参构造的话,生成的顺序表中的数组是一个空数组,此时我们认为没有分配内存
  • 第三种构造方法不太好理解。Collection是集合框架,?是通配符,是通配符泛型,表示可以接收 E 或 E 的子类的集合作为类型形参
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Number> list2 = new ArrayList<>(list1);  //相当于new ArrayList<>(ArrayList)

比如上面这个代码,构造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 c) 尾插 c 中所有元素

关于addAll,刚才讲构造方法的时候已经详细讲解了Collection 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);

「数据结构」3.ArrayList_第1张图片

扩容机制

添加元素时,ArrayList会检查是否需要扩容

  • 若需要扩容,初步预估按照1.5倍大小扩容;如果用户所需大小超过1.5倍的大小,则按照用户所需大小扩容(真正扩容之前会检测是否能扩容成功,防止太大导致扩容失败)
  • 使用copyof方法进行扩容,将现有的元素逐个复制到新的数组中,然后新的数组取代旧的数组成为ArrayList的内部容器

重要结论

通过查阅源码,我们可以得出以下两个结论,这里更重要的是记住结论,不必刻意去研究源码

结论1:对于add方法,如果顺序表一开始的有效容量为0,那么第一次add时会进行扩容,分配10个类型大小的内存

结论2ArrayList的扩容是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使用迭代器

  1. 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 + " ");
    }
}
  1. 迭代器是一种设计模式,接触更多的容器之后再讲

你可能感兴趣的:(Java数据结构,数据结构,java)