集合---list接口及实现类
一、list概述
1、list接口概述
List接口继承自Collection接口,是单列集合的一一个重要分支,我们习惯性地会将实现了
List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方
式进行有序存储的,在程序中可以通过索弓|来访问集合中的指定元素。
2、list接口的特点
有序可重复 有索引 可以判断重复
➢它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的
存储就是按照11、22、 33的顺序完成的)。, 有序重复
➢它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个
道理) 有索引
➢集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
3、ArryList常用的接口方法
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加
了一些根据元素索引来操作集 合的特有方法。
1、将指定的元素,添加到该集合中的指定位置上
public void add(int index, E element);
2、返回集合中指定位置的元素
public E get(int index) ;
3、移除列表中指定位置的元素,返回的是被移除的元素
public E remove(int index) ;
4、用指定元素替换集合中指定位置的元素,返回值的更新前
public E set(int index, E element) :
5、返回列表中指定的fromIndex (包括)和tolndex (不包括)之间的部分内容
public List<E> subList(int fromIndex, int tolndex):
6、找到集合中这个元素的下标位置
public int indexOf(Object o):
二 、list demo
/*** * List接口里面方法的基本操作* 1、List是有序且重复的,并且带索引的接口* 2、List的常见方法的演示* 3、list里面的remove方法,有两个方法的重载,分别是参数是int类型的index* 和参数是Object类型的对象,那么如果是一个Integer作为泛型的集合对象的话,你* 写的是整型,那么它会调用哪个方法呢?* 这里就必须要理解,此时它不需要自动装箱就能调用方法的话,它就不会去进行自动装箱* 所以,会调用参数是int类型的index的方法;**/
public class ListDemo {public static void main(String[] args) {//构建一个List对象List<String> list = new ArrayList<String>();list.add("中国");list.add("美国");list.add("俄罗斯");//带下标的add方法,下标就是你想要放入的位置的下标list.add(1, "德国");list.add("德国");list.add(null);System.out.println(list);//list接口下的其他方法//get方法System.out.println(list.get(1));//indexOfSystem.out.println(list.indexOf("美国"));//subListSystem.out.println(list.subList(1, 3));//setlist.set(list.size()-1, "日本");System.out.println(list);//removelist.remove(list.size()-1);System.out.println(list);list.remove("德国");//请问,如果list集合中存在重复的元素,那么remove会都删掉吗?System.out.println(list);//只会删除第一个查找到的元素List<Integer> list1 = new ArrayList<Integer>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.remove(1);//请问,这个1是object还是indexSystem.out.println(list1);}
}
三、list 的接口实现类
1、ArryList
ArrayList类的底层存储结构是数组结构。
可以直接通过下标来很迅速的找到指定下标的元素来进行操作,
所以ArrayList在操作指定下标的任意元素上面,速度比较快。
注意:
日常开发中程序员会习惯使用ArrayList来解决所有集合的问题,但是一定要注意,
它的底层是数组的特点决定于它只是查找上以及指定下标操作。上速度快。
2、LinkedList
底层是双向链表,既然底层是双向链表,所以我们在使用LinkedList来操作对象的时候,首
部和尾部元素的操作速度比较快。
3、Vector
ArrayList类出现之前的版本,ArrayList出现之后, 就不再使用Vector了,它和ArrayList的
区别,基本等同于StringBuffer和StringBuilder的区别。
四、LinkedList
只要涉及到首尾操作频繁的容器,就去找LinkedList的API方法即可,否则,只管用ArrayList。
public class LinkedListDemo {public static void main(String[] args) {//List接口的特点,在这里得到了体现:有序、重复,可以为nullLinkedList<String> list = new LinkedList<String>();list.add("aaa");list.add("bbb");list.add("ccc");list.add(null);list.add("aaa");System.out.println(list);//进行LinkedList里面的API方法的操作//添加到首部、尾部list.addFirst("kkk");System.out.println(list);list.addLast("zzz");System.out.println(list);//获取到首部和尾部的元素System.out.println(list.getFirst());System.out.println(list.getLast());//删除首部和尾部的元素list.removeFirst();System.out.println(list);list.removeLast();System.out.println(list);//弹栈:栈这个数据结构:堆柴火while(!list.isEmpty()) {//把集合顶部的元素弹出来System.out.println(list.pop());}System.out.println(list);}
}
五、单向链表
原理:
多个结点之间,通过地址进行连接。例如,多个人手拉手,
每个人使用自己的右手拉住下个人的左手,依次类推,这样多个
人就连在一起了。
特点:
查找元素慢,增删元素快。
/*** * 演示单向链表* 所谓单向链表我们可以看成是多个环扣在一起,但是只能作用第一个环,一旦你作用了第一个* 环,那么就会直接影响到剩下的所有环,这里是不允许你操作最后一个环的,因为双向链表就是* 可以允许你首尾都操作**/
public class SingleLinkedListDemo {public static void main(String[] args) {//创建一个首部节点Node head = new Node("黑桃A");//在当前节点上构建下一个节点对象head.next = new Node("红桃J");//继续往下面构建节点head.next.next = new Node("梅花3");head.next.next.next = new Node("方块8");System.out.println(head);}
}
class Node{//定义一个Object类型的属性,用来为每个环起名字Object value;//既然每个环可以操作下一个环,那么我们是否可以认为,每个环拥有下个环对象Node next;//创建一个有参的构造函数public Node(Object value) {this.value = value;}//重写toString方法,方便我们来看到整体的结构@Overridepublic String toString() {return next==null?value.toString():value.toString()+next.toString();}
}
六、链表内存图例

七、arraylist和linkedlist 运行方式比较

八、demo
千千静听播放列表(控制台版)
a、写一个song类, 里面有歌名和歌手
b、写一个demo类,使用集合为容器,往里面插入一些歌曲
C、然后来进行一个人性化的操作,里面有查看、追加、查找、删除、删除全部、退出等功能
d、要求,各个操作尽量的人性化
附加功能:如何才能真正的播放出音乐呢?
public class Song {private String songName;private String songAuthor;public Song() {}public Song(String songName, String songAuthor) {super();this.songName = songName;this.songAuthor = songAuthor;}public String getSongName() {return songName;}public void setSongName(String songName) {this.songName = songName;}public String getSongAuthor() {return songAuthor;}public void setSongAuthor(String songAuthor) {this.songAuthor = songAuthor;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((songAuthor == null) ? 0 : songAuthor.hashCode());result = prime * result + ((songName == null) ? 0 : songName.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Song other = (Song) obj;if (songAuthor == null) {if (other.songAuthor != null)return false;} else if (!songAuthor.equals(other.songAuthor))return false;if (songName == null) {if (other.songName != null)return false;} else if (!songName.equals(other.songName))return false;return true;}@Overridepublic String toString() {return "<"+songName+"_"+songAuthor+">";}
}
public class SongDemo {public static void main(String[] args) {ArrayList<Song> songs = initSongs();//输出欢迎语句System.out.println("欢迎使用XXXX播放器");//创建一个Scanner对象Scanner sc = new Scanner(System.in);//设置一个死循环while(true) {System.out.println("请输入你要进行的操作:1.查看;2.追加;3.查找;4.删除;5.删除所有;6.退出");int order = sc.nextInt();boolean flag =false;switch(order) {case 1:if(songs.isEmpty()) {System.out.println("你的播放列表为空");}else {System.out.println(songs);};break;case 2:System.out.println("请输入你要添加的歌曲名和歌手名:");String songName = sc.next();String songAuthor = sc.next();Song newSong = new Song(songName,songAuthor);if(songs.contains(newSong)) {System.out.println("您的播放列表中已经存在该歌曲,是否要继续添加进列表?(1为添加,2为不添加)");int newOrder = sc.nextInt();if(newOrder==1) {songs.add(newSong);System.out.println("歌曲添加成功!");}}else {songs.add(newSong);System.out.println("歌曲添加成功!");};break;case 3:System.out.println("请输入您要查找的歌手名:");String author = sc.next();//定义一个集合,用来放查找到的Song对象的ArrayList<Song> newList = new ArrayList<Song>();for(Song s:songs) {if(s.getSongAuthor().equals(author)) {newList.add(s);}}if(newList.isEmpty()) {System.out.println("对不起,您要查找的歌手没有对应的数据");}else {System.out.println(newList);};break;case 4:System.out.println("请输入您要删除的歌曲名和歌手名:");String songName1 = sc.next();String songAuthor1 = sc.next();Song newSong1 = new Song(songName1,songAuthor1);if(songs.contains(newSong1)) {//如果没有重写equals方法的话那么这里就会出问题songs.remove(newSong1);System.out.println("删除成功!");}else{System.out.println("对不起,您要删除的歌曲不存在!");};break;case 5:System.out.println("你确定要删除所有歌曲吗?(1.确定;2.考虑下)");int order1 = sc.nextInt();if(order1==1) {songs.clear();System.out.println("删除成功!");};break;case 6:System.out.println("你确定要退出那么好玩的游戏吗?(1.确定;2.考虑下)");int order2 = sc.nextInt();if(order2==1) {System.out.println("欢迎下次继续来使用本软件,够的败!");flag = true;};break;default:System.out.println("您所输入的指令不正确,请重新输入!");}if(flag) {break;}}}//初始化一个有歌曲的播放器public static ArrayList<Song> initSongs(){ArrayList<Song> songs = new ArrayList<Song>();songs.add(new Song("忘情水","刘德华"));songs.add(new Song("练习","刘德华"));songs.add(new Song("饿狼传说","张学友"));return songs;}
}相关文章:
集合---list接口及实现类
一、list概述 1、list接口概述 List接口继承自Collection接口,是单列集合的一一个重要分支,我们习惯性地会将实现了 List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方 式进行有序存储的,在…...
JVM简述
JDK&JRE&JVMJVM运行时内存结构图方法区堆区栈区程序计数器本地方法栈 JVM 的主要组成部分及其作用 JDK&JRE&JVM JVM就是java虚拟机,一台虚拟的机器,用来运行java代码 但并不是只有这台机器就可以的,java程序在运行时需要依赖…...
7.25训练总结
考场错误: A题其实并不简单,但是先想了一个方法后,就交了,wa了后一直卡住,策略不当,到最后后期写C的时候也犯了一些低级的错误,这点需要注意。 之后顺利的把BCDHI写完后,又完成了A的…...
java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?
一、注解EnableFeignClients 修饰在spring boot入口类,使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…...
神经网络随记-参数矩阵、剪枝、模型压缩、大小匹配、、
神经网络的参数矩阵 在神经网络中,参数矩阵是模型学习的关键部分,它包含了神经网络的权重和偏置项。下面是神经网络中常见的参数矩阵: 权重矩阵(Weight Matrix):权重矩阵用于线性变换操作,将输…...
4、Kubernetes 集群 YAML 文件详解
目录 一、YAML 概述 二、YAML 基本语法 三、YAML 数据结构 四、k8s资源清单描述方法 五、YAML 快速编写 1、使用 kubectl create 命令 2、使用 kubectl get 命令导出 yaml 文件 一、YAML 概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明YAML文件来解决&…...
leetcode93. 复原 IP 地址(java)
复原 IP 地址 leetcode93. 复原 IP 地址回溯算法代码演示 回溯算法 leetcode93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2…...
极光Java 版本服务器端实现别名消息推送
文章目录 引言I 概述1.1 依赖包1.2 极光证书环境参数1.3 构建推送对象II 推送内容2.1 配置推送内容2.2 获取通知消息内容2.3 配置IOS通知内容2.4 配置Android通知内容2.5 发起推送2.6 分批推送2.7 初始化密钥2.8 配置密钥引言 REST API 文档:https://docs.jiguang.cn/jpush/se…...
【Lua学习笔记】Lua进阶——Table(4)继承,封装,多态
文章目录 封装继承多态 封装 // 定义基类 Object {}//由于表的特性,该句就相当于定义基类变量 Object.id 1//该句相当于定义方法,Object可以视为定义的对象,Test可以视为方法名 //我们知道Object是一个表,但是抽象地看ÿ…...
Linux中常用的指令
ls ls [选项] [目录或文件] 功能:对于目录,列出该目录下所有的子目录和文件;对于文件,列出该文件的文件名和其他属性 常用选项: -a:列出目录下的所有文件,包括以.开头的隐藏文件 -l:列出文件的详细信息。…...
【java】【面对对象高级4】内部类、枚举、泛型
目录 1、内部类 1.1 成员内部类【了解】 1.1.1 定义 1.1.2 扩展变量 1.2 静态内部类【了解】 1.2.1 定义 1.2.2 扩展变量 1.3 局部内部类【了解】 1.4 匿名内部类【重点】 1.4.1 定义 1.4.1.1 常规写法 1.4.1.2 匿名内部类改造 1.4.2 匿名内部类的常见使用场景 1.4.2…...
Python的用处到底是什么?(三)
11. 数据库操作:Python的库,如sqlite3和SQLAlchemy,可以连接和操作各种类型的数据库。 Python提供了一些库和工具,如sqlite3和SQLAlchemy,用于连接和操作各种类型的数据库。以下是关于这两个库的详细解释:…...
【Nodejs】Express基本使用
Express 中文网 基于 Node.js 平台,快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目,在安装npm之前可先安装淘宝镜像: npm install -g cnpm --registryhttps://registry.npmmirror.com/…...
k8s集群安装v1.20.9
参考网上资料并将异常问题解决,经测试可正常安装集群。 1.我的环境准备 本人使用vmware pro 17新建三个centos7虚拟机,每个2cpu,20GB磁盘存储,内存2GB,其中主节点的内存3GB,可使用外网. 2.所有节点安装D…...
Staples Drop Ship EDI 需求分析
Staples 是一家美国零售公司,总部位于马萨诸塞州弗拉明汉,主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年,该公司已跻身《财富》世界 500 强,后来又收购了办公用品公司 Qu…...
模型调参及优化
调参 调权重参数,偏置参数 训练数据集用来训练参数w,b 调超参数 验证数据集用来选择超参数学习率lr,隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合;当训练误差降下去,但泛化误差出现上升形式&…...
多数据源数据转换和同步的ETL工具推荐
有许多支持多数据源数据转换和同步的ETL工具可供选择。以下是一些常见的ETL工具和它们支持多数据源数据转换和同步的特点: Apache NiFi:Apache NiFi是一个开源的ETL工具,支持多种数据源的连接,包括文件系统、数据库、消息队列、网…...
配置 gitlab https 访问
文章目录 1. 备份2. 生成SSL证书3. 配置文件4. 重启5. 访问 1. 备份 docker exec -ti gitlab-ce gitlab-rake gitlab:backup:create2. 生成SSL证书 yum install openssl openssl-devel -y mkdir /data/gitlab/config/ssl ; cd /data/gitlab/config/ssl### 生成证书 openssl…...
Kepware Modbus驱动简介
1. Modbus驱动能够解决什么问题? 它是Modbus设备驱动的集合,为用户提供一种方便快捷的Modbus设备数采解决方案。 只需要通过简单的配置就可以将常见的例如Modbus TCP/IP Ethernet、RTU Serial 和 ASCII Serial等协议设备无缝连接到 HMI/SCADA、MES/His…...
Python并发革命进行时:GIL移除后你必须掌握的5种内存序模型(x86/ARM/RISC-V实测对比)
第一章:Python无锁GIL环境下的并发模型架构总览传统CPython解释器受全局解释器锁(GIL)制约,无法真正实现多线程CPU并行。而“无锁GIL环境”并非指移除GIL本身,而是指在GIL被主动释放、绕过或由替代运行时(如…...
从数据采集到模型部署:用Lerobot+本地数据集训练一个会抓积木的机械臂(避坑指南)
从数据采集到模型部署:用Lerobot本地数据集训练一个会抓积木的机械臂(避坑指南) 当机械臂第一次准确抓取乐高积木并放入指定盒子时,那种成就感远超单纯调通代码的快感。Lerobot框架的出现,让机器人学习从实验室走向个人…...
手机拍照为啥总感觉差点意思?聊聊藏在ISP里的那些‘魔法’算法(从RawNR到TNR)
手机拍照为啥总感觉差点意思?聊聊藏在ISP里的那些‘魔法’算法(从RawNR到TNR) 每次看到别人用同款手机拍出的大片,再看看自己相册里灰蒙蒙的夜景照,是不是总觉得少了点什么?这背后其实藏着一整套名为ISP&am…...
如何突破Windows权限壁垒?系统管理专家的秘密武器
如何突破Windows权限壁垒?系统管理专家的秘密武器 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo 在W…...
网络安全学习攻略宝典,从菜鸟到高手的必由之路
想成为一名真正的黑客到底该怎么学? 从0开始又该从何学起呢? 很多人想学习网络安全,却不知道从何下手。别迷茫,这篇文章为你指明方向,无论你是零基础小白,还是有一定基础想提升的人,都能从中找…...
2026最权威一键生成论文工具榜单:这些被高校和导师悄悄推荐的软件你用了吗
一键生成论文工具正成为学术研究的重要助力,其高效性与专业性在近年来得到广泛认可。依托权威检测平台数据、高校实测反馈及用户真实评价,这些工具已逐步成为科研工作者和学生群体的得力助手。本文将盘点2026年最受高校和导师推荐的一键生成论文软件&…...
Onekey:突破Steam清单管理瓶颈的全场景开源解决方案
Onekey:突破Steam清单管理瓶颈的全场景开源解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在数字游戏产业蓬勃发展的今天,Steam平台已成为全球最大的综合性数字…...
Phi-4-Reasoning-Vision应用场景:法律文书配图证据链推理系统
Phi-4-Reasoning-Vision应用场景:法律文书配图证据链推理系统 1. 法律文书配图证据链推理系统概述 在法律实务中,证据链的构建往往需要处理大量图文混合材料。传统人工分析方式存在效率低下、主观性强、容易遗漏细节等问题。基于Phi-4-Reasoning-Visio…...
3个AI脚本让Illustrator设计效率提升300%:从重复劳动到创意爆发
3个AI脚本让Illustrator设计效率提升300%:从重复劳动到创意爆发 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 作为设计师,你是否每天花费40%以上时间在重复…...
Spring PetClinic实战解析:从单体应用到云原生部署的5大架构亮点
Spring PetClinic实战解析:从单体应用到云原生部署的5大架构亮点 【免费下载链接】spring-petclinic A sample Spring-based application 项目地址: https://gitcode.com/gh_mirrors/sp/spring-petclinic 你是否遇到过这样的困境:在学习Spring框架…...
