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

【数据结构】初识集合&深入剖析顺序表(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>() {@Overridepublic 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创建ListList<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);//删除目标元素1list.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创建ListList<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() + " ");}//增强forfor(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");// 打印ArrayListSystem.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);// 遍历ArrayListSystem.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);//增强forfor (Integer integer : arrayList) {System.out.println(integer);}//普通forfor(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.mzph.cn/pingmian/28250.shtml

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

相关文章

【全栈实战】大模型自学:从入门到实战打怪升级,20W字总结(一)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本栏讲解【全栈实战】大模型自学&#xff1a;从入门到实战打怪升级。 &#x1f514;专栏持续更新&#xff0c;适合人群&#xff1a;本科生、研究生、大模型爱好者&#xff0c;期…

JVM-GC-什么是垃圾

JVM-GC-什么是垃圾 前言 所谓垃圾其实是指&#xff0c;内存中没用的数据&#xff1b;没有任何引用指向这块内存&#xff0c;或者没有任何指针指向这块内存。没有的数据应该被清除&#xff0c;垃圾的处理其实是内存管理问题。 JVM虽然不直接遵循冯诺依曼计算机体系架构&#…

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…

用PHP来调用API给自己定制一个“每日新闻”

头条新闻汇聚了互联网上的时事动态&#xff0c;提供最新新闻动态、网络热门话题和视频更新等&#xff0c;覆盖社会、政治、体育、经济、娱乐、科技等多个领域&#xff0c;并不断刷新内容。企业应用这一接口后&#xff0c;可以快速吸引更多的用户访问自己的平台。即使是非新闻类…

面向对象的三大特性与类图

1. 面向对象编程的三大特点 Object-oriented programming (OOP) is a paradigm centered around the concept of objects, which can contain data and code to manipulate that data. The three major characteristics of object-oriented programming are encapsulation, in…

天童美语:为了得体退出的那一天,你一定要好好爱孩子

父母最大的成就就是孩子可以独立&#xff0c;自己完成自己的人生。为了得体退出的那一天&#xff0c;你一定要好好爱你的小孩&#xff0c;因为每一天都在过去。当我们站在孩子成长的十字路口&#xff0c;面对那个终将到来的退出时刻&#xff0c;心中总会涌起一股难以言表的情感…

有趣的傅里叶变换与小波变换对比(Python)

不严谨的说&#xff0c;时域和频域分析就是在不同的空间看待问题的&#xff0c;不同空间所对应的原子(基函数)是不同的。你想一下时域空间的基函数是什么&#xff1f;频域空间的基函数是什么&#xff1f;一般的时-频联合域空间的基函数是什么&#xff1f;小波域空间的基函数是什…

摄影师在人工智能竞赛中与机器较量并获胜

摄影师在人工智能竞赛中与机器较量并获胜 自从生成式人工智能出现以来&#xff0c;由来已久的人机大战显然呈现出一边倒的态势。但是有一位摄影师&#xff0c;一心想证明用人眼拍摄的照片是有道理的&#xff0c;他向算法驱动的竞争对手发起了挑战&#xff0c;并取得了胜利。 迈…

课时157:脚本发布_简单脚本_功能函数

2.1.3 功能函数 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 需求&#xff1a;三条命令其实是一个组合&#xff0c;实现的是一个功能简单实践 实践 查看脚本内容 #!/bin/bash # 功能&#xff1a;打包代码 # 版本: v0.3 #…

代码随想录第29天|贪心算法part3

134.加油站 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈 每个加油站的剩余量rest[i]为gas[i] - cost[i] 从0开始累加rest[i]&#xff0c;和记为curSum&#xff0c;一旦curSum小于零&#xff0c;说明[0, i]区间都不能作为起始位置 因为我们一直维护的是一个剩余量大…

HCIA11 网络安全之本地 AAA 配置实验

AAA 提供 Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和 Accounting&#xff08;计费&#xff09;三种安全功能。 • 认证&#xff1a;验证用户是否可以获得网络访问权。 • 授权&#xff1a;授权用户可以使用哪些服务。 •…

机器学习中的监督学习介绍

In this post well go into the concept of supervised learning, the requirements for machines to learn, and the process of learning and enhancing prediction accuracy. 在这篇文章中&#xff0c;我们将深入探讨监督学习的概念、机器学习的要求以及学习和提高预测准确…

Kotlin 协程:从基础概念到开发实践

前言 上一篇文章 深入理解Android多线程开发:场景应用与解决方案解析 针对Android开发中的多线程应用场景和相应的解决方案做了一个梳理。 总结出了Android开发中多线程编程的几个重要点: 资源复用和优化切线程任务编排并结合示例说明了Kotlin协程在处理上述问题时的优势。 …

如何删除:systemctl status ztncui

要删除 systemctl status ztncui&#xff0c;需要卸载与该服务相关的程序&#xff0c;并停止和禁用该服务。以下是详细的步骤&#xff1a; 停止服务&#xff1a; sudo systemctl stop ztncui 禁用服务&#xff1a; sudo systemctl disable ztncui 删除服务文件&#xff1a;…

归纳贪心好题

很有趣的一道归纳贪心题目 class Solution { public:int minimumAddedCoins(vector<int>& coins, int target) {sort(coins.begin(),coins.end());int n coins.size();int s 0,i0;int res 0;while(s<target){if(i<n&&coins[i]<s1)scoins[i];els…

图像分隔和深度成像技术为什么受市场欢迎-数字孪生技术和物联网智能汽车技术的大爆发?分析一下图像技术的前生后世

图像分隔和深度成像是计算机视觉和图像处理领域的两项重要技术&#xff0c;它们各自有不同的技术基础和要点。 图像分隔技术基础&#xff1a; 机器学习和模式识别&#xff1a; 图像分隔通常依赖于机器学习算法&#xff0c;如支持向量机&#xff08;SVM&#xff09;、随机森林…

算法题--华为od机试考试(开源项目热度榜单、API集群负载统计、分月饼)

目录 开源项目热度榜单 题目描述 输入描述 输出描述 示例1 输入 输出 解析 答案 API集群负载统计 题目描述 输入描述 输出描述 示例1 输入 输出 解析 答案 分月饼 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入 输出 说明 示例3…

Python 操作Redis

本篇介绍在Python中如何使用Redis。 目录 安装类库 引入类库 操作读写 使用pipeline 封装 封装redis 操作 调用 总结 安装类库 首先通过pip list命令查看&#xff0c; 本地安装类库中是否有redis类库&#xff0c; 如果没有开始安装。 安装命令如下&#xff1a; pip…

顶顶通呼叫中心中间件-限制最大通话时间(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-限制最大通话时间(mod_cti基于FreeSWITCH) 一、最大通话时间 1、配置拨号方案 1、点击拨号方案 ->2、在框中输入通话最大时长->3、点击添加->4、根据图中配置->5、勾选continue。修改拨号方案需要等待一分钟即可生效 action"sched…