【数据结构】初识集合&深入剖析顺序表(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倍还放不下,新创建的数组的长度以实际为准

相关推荐
A懿轩A2 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香7 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
️南城丶北离1 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻1 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439696 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php