【数据结构】初识集合&深入剖析顺序表(Arraylist)

【数据结构】初识集合&深入剖析顺序表(Arraylist)

🚀所属专栏:数据结构与算法学习⭐⭐

🚀欢迎光顾我的主页: 2的n次方_⭐⭐

集合体系结构

Java集合框架主要由以下几个部分组成:

接口:这是集合框架的基础,定义了各种集合的基本操作,如添加、删除、查找等。主要的接口有Collection、List、Set、Queue、Map等。

实现类:这些类实现了集合框架中的接口,提供了具体的集合实现。例如,ArrayList、LinkedList实现了List接口,HashSet、TreeSet实现了Set接口,HashMap、TreeMap实现了Map接口等。

迭代器:迭代器(Iterator)允许程序员遍历集合中的元素,而无需了解集合底层的实现细节

同时,集合在Java中确实分为单列集合(Collection)和双列集合(Map)两大类,单列集合就是下图中左边的部分,每次存储一个元素,双列集合是由键(key)和值(value)组成的集合,也称为键值对集合

List系列集合:添加的元素是有序的,可重复,有索引的
Set系列集合:添加的元素是无序的,不重复,无索引的
由于这个特性,在添加元素时List系列集合允许元素重复,add返回值为true,set系列集合不允许元素重复,元素重复时add返回值为false

Collection是所有单列集合的父类接口,也就是它的功能所有的单列集合都可以用

contains方法底层是依赖equals方法进行判断的,所以,如果集合中存储的类型是自定义类型,就要重写equals方法,否则会直接调用Object类的equals方法

集合的遍历

迭代器

就相当于c语言中的指针,通过迭代器就可以实现集合的遍历

java 复制代码
public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("hello");
        c.add("world");
        Iterator<String> it = c.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

注意:

如果已经遍历完最后一个元素,再强行往后遍历就会报错

迭代器遍历完毕,指针不会复位,如果要再遍历一遍,就要重新创建迭代器对象

循环中只能用一次next方法

迭代器遍历时,不会能用集合中的方法进行增加或者删除

增强for遍历

增强for底层就是迭代器,是为了简化迭代器的代码而出现的,所有的单列集合和数组才能用增强for来遍历

格式:
for(元素类型 变量名 :数组或集合){
}

java 复制代码
public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("aa");
        c.add("bb");
        c.add("cc");
        for(String s:c){
            System.out.print(s + " ");
        }
    }

注意:修改增强for中的变量,不会修改集合中的数据

java 复制代码
public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("aa");
        c.add("bb");
        c.add("cc");
        for(String s:c){
            s = "dd";
        }
        System.out.println(c);
    }

运行结果依然是之前集合中的内容

lambda表达式

lambda通过调用forEach方法实现的,先用匿名内部类的形式来实现一下

java 复制代码
c.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

在此基础上就可以修改为lambda表达式

java 复制代码
c.forEach((s)-> {System.out.println(s);});

此时,s的小括号和执行语句中的{}和;都可以进行省略

java 复制代码
c.forEach(s-> System.out.println(s));

List接口中的增删查改

由于List接口继承了Collection接口,所以Collection中的方法List都可以使用,同时List还有特有的方法

java 复制代码
public class ListDemo {
    public static void main(String[] args) {
        //通过实现类ArrayList创建List
        List<Integer> list = new ArrayList<>();
        // 添加元素
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        //删除1索引元素
        list.remove(1);
        Integer i = Integer.valueOf(1);
        //删除目标元素1
        list.remove(i);
        System.out.println(list);
        //修改目标元素
        list.set(0, 10);
        //获取目标元素
        int l = list.get(1);
        System.out.println(l);
    }
}

在删除元素的时候需要注意,如果是Integer类型的元素,传参之后就会区分不清是索引还是目标元素,就需要通过创建对象的方式,传入Integer类型的对象,以此和索引进行区分

List的5种遍历

java 复制代码
public class ListDemo {
    public static void main(String[] args) {
        //通过实现类ArrayList创建List
        List<Integer> list = new ArrayList<>();
        // 添加元素
        list.add(1);
        list.add(2);
        list.add(3);
        //迭代器
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            System.out.print(it.next() + " ");
        }
        //增强for
        for(Integer i1:list){
            System.out.println(i1);
        }
        //lambda表达
        list.forEach((s)-> System.out.print(s + " "));
        //普通for循环
        for (int j = 0; j < list.size(); j++) {
            System.out.println(list.get(j));
        }
        //列表迭代器
        ListIterator<Integer> it2 = list.listIterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
    }
}

列表迭代器ListIterator接口继承了Iterator接口,因此ListIterator拥有Iterator的所有方法,并在此基础上增加了额外的功能。

使用列表迭代器进行遍历时,如果用到了添加元素的操作,应该通过迭代器的对象去调用add方法,用List的对象去调用就会报错

java 复制代码
ListIterator<Integer> it2 = list.listIterator();
        while (it2.hasNext()) {
            System.out.println(it2.next());
            it2.add(100);
            list.add(101);//报错
        }

适用场景:
迭代器遍历:在遍历过程中需要删除元素
列表迭代器:在遍历过程中需要添加元素
增强for,lambda表达式:只作遍历使用
普通for:遍历时需要操作索引

ArrayList详解

ArrayList是一个广泛使用的集合类,它实现了List接口,提供了动态数组的功能,与普通的数组不同,ArrayList能够自动调整其大小以容纳新的元素。

ArrayList的创建

集合和数组的对比:

集合的长度可变,数组的长度固定

数组可以存基本数据类型和引用数据类型,集合只能存储引用数据类型,如果要存基本数据类型就需要将其转换为对应的包装类

创建ArrayList的对象时,是通过泛型来规定存储的类型

java 复制代码
ArrayList<Integer> arrayList = new ArrayList<>();

ArrayList的增删查改

ArrayList实现了List接口,所以List中的方法也可以使用

java 复制代码
public class ArrayListExample {
    public static void main(String[] args) {
        // 创建一个ArrayList实例
        ArrayList<String> list = new ArrayList<>();

        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // 打印ArrayList
        System.out.println("ArrayList: " + list);

        // 访问元素
        String fruit = list.get(1);
        System.out.println("访问第二个元素: " + fruit);

        // 修改元素
        list.set(1, "Mango");
        System.out.println("修改后的ArrayList: " + list);

        // 删除元素
        list.remove(2);
        System.out.println("删除元素后的ArrayList: " + list);

        // 获取大小
        int size = list.size();
        System.out.println("ArrayList的大小: " + size);

        // 遍历ArrayList
        System.out.print("遍历ArrayList: ");
        for (String item : list) {
            System.out.print(item + " ");
        }
    }
}

ArrayList的遍历

ArrayList也有非常多中遍历方式

java 复制代码
ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //增强for
        for (Integer integer : arrayList) {
            System.out.println(integer);
        }
        //普通for
        for(int j = 0;j < arrayList.size();j++){
            System.out.println(arrayList.get(j));
        }
        //迭代器
        Iterator<Integer> it3 = arrayList.iterator();
        while (it.hasNext()) {
            System.out.println(it3.next());
        }
        //列表迭代器
        ListIterator<Integer> it4 = arrayList.listIterator();
        while (it3.hasNext()) {
            System.out.println(it4.next());
        }
        //lambda表达式
        list.forEach(s -> System.out.print(s + " "));

ArrayList的底层原理

利用空参构造创建的集合,在底层会创建一个默认长度为0的数组

添加第一个元素时,底层会创建一个新的长度为10的数组

存满时会扩容1.5倍

如果一次添加多个元素,1.5倍还放不下,新创建的数组的长度以实际为准

相关推荐
小奶包他干奶奶2 小时前
Webpack学习——Loader(文件转换器)
前端·学习·webpack
小奶包他干奶奶2 小时前
Webpack学习——原理理解
学习·webpack·devops
励志成为美貌才华为一体的女子2 小时前
强化学习PPO和GRPO逻辑学习
学习
tobebetter95272 小时前
How to manage python versions on windows
开发语言·windows·python
meichaoWen3 小时前
【Vue3】vue3的全面学习(一)
前端·javascript·学习
FFF团团员9093 小时前
树莓派学习笔记3:LED和Button
笔记·学习
9***P3343 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger3 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz4 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
多多*4 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven