「数据结构」3.ArrayList

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

🍉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个类型大小的内存

结论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. 迭代器是一种设计模式,接触更多的容器之后再讲

相关推荐

  1. ArrayList数据结构

    2024-02-02 11:28:02       51 阅读
  2. 数据结构 模拟实现ArrayList顺序表

    2024-02-02 11:28:02       53 阅读
  3. 数据结构】5.ArrayList与顺序表

    2024-02-02 11:28:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 11:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 11:28:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 11:28:02       82 阅读
  4. Python语言-面向对象

    2024-02-02 11:28:02       91 阅读

热门阅读

  1. day9笔记

    2024-02-02 11:28:02       55 阅读
  2. Golang防止注入常用方法

    2024-02-02 11:28:02       49 阅读
  3. SpringBoot整理-微服务

    2024-02-02 11:28:02       48 阅读
  4. 为什么golang不支持可重入锁呢?

    2024-02-02 11:28:02       54 阅读
  5. 爬虫学习:下厨房的菜谱搜索

    2024-02-02 11:28:02       53 阅读
  6. listagg、xmlagg、group_concat()函数用法

    2024-02-02 11:28:02       59 阅读