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

news2024/10/6 5:10:00

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

  • 集合体系结构
  • 集合的遍历
    • 迭代器
    • 增强for遍历
    • lambda表达式
  • List接口中的增删查改
  • List的5种遍历
  • ArrayList详解
    • ArrayList的创建
    • ArrayList的增删查改
    • 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语言中的指针,通过迭代器就可以实现集合的遍历

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(元素类型 变量名 :数组或集合){
}

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中的变量,不会修改集合中的数据

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方法实现的,先用匿名内部类的形式来实现一下

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

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

c.forEach((s)-> {System.out.println(s);});

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

c.forEach(s-> System.out.println(s));

List接口中的增删查改

由于List接口继承了Collection接口,所以Collection中的方法List都可以使用,同时List还有特有的方法
在这里插入图片描述

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种遍历

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的对象去调用就会报错

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的对象时,是通过泛型来规定存储的类型

ArrayList<Integer> arrayList = new ArrayList<>();

ArrayList的增删查改

ArrayList实现了List接口,所以List中的方法也可以使用
在这里插入图片描述

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也有非常多中遍历方式

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倍还放不下,新创建的数组的长度以实际为准
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UnityAPI学习之 播放游戏音频的类(AudioSource)

播放游戏音频的类&#xff08;AudioSource&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class NO17AudioSource : MonoBehaviour {private AudioSource audioSource;//音频组件public AudioClip clip;//音频文件public…

预编译、函数变量提升

函数声明会覆盖变量的声明&#xff0c;也就是会提升到最前面。 形参传进来相当于变量声明&#xff0c;所以当有函数声明时&#xff0c;会被覆盖。

情绪管理:大我则定,小我则乱(王阳明)

学了很多知识&#xff0c;却还是感物易动&#xff1f;如何让心回归中正&#xff1f;王阳明一言以蔽之&#xff1a; —— 大我&#xff0c;大我则定&#xff0c;小我则乱 保持心静的方法&#xff1a;有大爱&#xff0c;为大局着想

Spark-Shuffle阶段优化-Bypass机制详解

Spark概述 Spark-Shuffle阶段优化-Bypass机制详解 Spark的Bypass机制是一种特定情况下的优化策略&#xff0c;目的是减少Shuffle过程中不必要的排序开销&#xff0c;从而提升性能。当Shuffle分区数较少且数据量不大时&#xff0c;Bypass机制可以显著加快Shuffle速度。 1.什么…

使用 Nginx 和 SSL 访问 Python Flask 应用的教程

在本教程中&#xff0c;我们将介绍如何使用 Nginx 和 SSL 来访问 Python Flask 应用。通过这种方式&#xff0c;你可以在提高安全性的同时&#xff0c;也能利用 Nginx 的反向代理功能来优化应用的性能和稳定性。 环境准备 在开始之前&#xff0c;请确保你的系统已经安装了以…

准备离职了 电脑怎么清理?离职最干净的电脑清理办法

准备离职了 电脑怎么清理&#xff1f;离职最干净的电脑清理办法 人在江湖身不由己&#xff0c;离职这个事情&#xff0c;所有人都要面对。无论是出于个人发展、工作环境、薪资待遇还是其他原因&#xff0c;离职都是人生和职业道路上的一种常态。离职是一个残酷的事实&#xff…

【每日刷题】Day66

【每日刷题】Day66 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 小乐乐改数字_牛客题霸_牛客网 (nowcoder.com) 2. 牛牛的递增之旅_牛客题霸_牛客网 (nowcoder.com)…

Zabbix Centos8 安装笔记

Zabbix 安装笔记 安装环境 Centos 8 正常发行版 安装版本 Zabbix 7 (LTS) 安装步骤 1、关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/c…

Elasticsearch 认证模拟题 - 22

一、题目 索引 task 索引中文档的 fielda 字段内容包括了 hello & world&#xff0c;索引后&#xff0c;要求使用 match_phrase query 查询 hello & world 或者 hello and world 都能匹配该文档 1.1 考点 分词器 1.2 答案 # 创建符合条件的 task 索引&#xff0c;…

诊断丢帧:发送端连续帧发送过快,导致接收端丢帧

项目场景: 在项目开发过程中,对于报文的接收/发送,一般来说,通信量大,选择Polling(轮询)处理模式;通信量小,选择Interrupt(中断)处理模式。具体选择没有优劣之分。结合项目的实际情况,选择适合项目的方式就好。小编将分享一个Polling模式下出现的丢帧现象。 1576…

Ps:脚本事件管理器

Ps菜单&#xff1a;文件/脚本/脚本事件管理器 Scripts/Script Events Manager 脚本事件管理器 Script Events Manager允许用户将特定的事件&#xff08;如打开、存储或导出文件&#xff09;与 JavaScript 脚本或 Photoshop 动作关联起来&#xff0c;以便在这些事件发生时自动触…

exfat文件系统无法NFS导出的问题

最近项目中移植了exfat-linux驱动&#xff0c;但发现exfat格式的U盘无法用exportfs命令在NFS上导出。这篇文章记录了分析、解决方法。 一、问题现象 问题描述&#xff1a;exfat驱动更新后&#xff0c;exfat格式的U盘用exportfs命令NFS导出会报错 $ exportfs -o ro,fsid0,no_ro…

用飞书写博客,并自动部署

feishu-vitepress 用飞书写博客,并自动部署 目前的静态博客如vitepress&#xff0c;主要是用markdown来写内容。markdown虽然可读性比较好&#xff0c;但是在文章中贴图片有点麻烦&#xff0c;需要先保存图片到asset目录下&#xff0c;再在markdown中写图片地址。 平时工作主要…

软件方案评审与模块优化:从FOC模块出发的电控平台建设

一、背景 洞悉模块发展趋势&#xff0c;定制行业应用特点&#xff0c;明确优化方向与阶段性目标 随着科技进步的飞速发展&#xff0c;模块化设计已成为众多行业产品开发的核心理念。无论是软件系统、硬件组件&#xff0c;还是复杂系统中的功能模块&#xff0c;都需要对其发展…

STM32学习 BKP

BKP就是备份寄存器的意思&#xff0c;听名字就知道它的作用就是用来备份数据的。下面是手册当中的描述。备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域 里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串分隔(二)(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串分隔(二)(100分) 🌍 评测功能需要订阅专栏后私信联系…

【推荐】Perl入门教程特点功能文本处理读取文件替换文本写入文件分割字符数据库处理环境准备安装(包含示咧)

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

WSL Ubuntu安装TensorFlow-GPU、PyTorch-GPU

在Windows 11的WSL Ubuntu中安装TensorFlow-GPU、PyTorch-GPU 0、WSL Ubuntu安装 在Windows 11的商店中下载即可&#xff0c;此处以Ubuntu22.04.3为例 1、CUDA Toolkit安装 参考公孙启的文章Windows11 WSL Ubuntu Pycharm Conda for deeplearning前往nVidia官网下载CUDA …

从数据库到数据仓库:数据仓库导论

导言 本文为数据仓库导论&#xff0c;旨在介绍数据仓库的基本理念和应用场景&#xff0c;帮助读者理解数据仓库的重要性及其在企业中的实际应用。 数据仓库作为重要的数据管理和分析工具&#xff0c;已经发展了30多年&#xff0c;其过程中生态和技术都发生了巨大的变化。尽管…