集合---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…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...