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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...