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

从零开始学习CTF——CTF是什么
引言: 从2019年10月开始接触CTF,学习了sql注入、文件包含等web知识点,但都是只知道知识点却实用不上,后来在刷CTF题才发现知识点的使用方法,知道在哪里使用,哪里容易出漏洞,可是在挖src漏洞中还…...

为Android构建现代应用——主体结构
创建Screents和ViewModels 在前面的章节中,我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。 在本章中,我们将开始实现初始结构和模板,这将联接每一个应用程序的部分。 首先将添加以下带有各自视图模型的主屏幕: •…...

【shell脚本】shell脚本之日志切割(进阶实战三)
恭喜你,找到宝藏博主了,这里会分享shell的学习整过程。 shell 对于运维来说是必备技能之一,它可以提高很多运维重复工作,提高效率。 shell的专栏,我会详细地讲解shell的基础和使用,以及一些比较常用的she…...

VMLogin和虚拟机里的浏览器有什么区别?
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。 指纹浏览器,也称防关联浏览器。 简单来说,就是允许在同一台电设备上操作和管理多个平台、多个账号,账…...

unimrcp server的session资源分配与回收
unimrcp使用APR的内存池管理内存,因此,处理函数中一般都会传递一个pool指针,需要内存时,就从pool里分配一块,一般也不需要关心内存的释放。因为,一路呼叫关联一个session,一个session对应一个po…...
【图论】三种中心性 —— 特征向量、katz 和 PageRank
维基百科:在图论和网络分析中,中心性指标为图中相应网络位置的节点分配排名或数值。中心性这一概念最初起源于社交网络分析,因此很多衡量中心性的术语也反映了其社会学背景。 不同中心性指标对 “重要” 的衡量方式不同,因此适用于…...

[sqoop]将hive查询后的数据导入到MySQL
一、知识点 export:将Hive的表导入到mysql叫导出 搜了很多,发现sqoop在hive导出到mysql时 1)不支持where参数对数据进行过滤。 2)不支持指定hive表的方式导出,只能指定Hive目录进行导出。 二、操作 1、在MySQL中建表 creat…...

Linux df、du命令
df:查看文件系统硬盘使用情况 df 命令,用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。 df 命令的基本格式为: [rootlocalhost ~]# df [选项] [目录或文件名] df…...

java版+免费商城搭建+小程序商城免费搭建+Spring Cloud + Spring Boot + MybatisPlus + 前后端分离 + 二次开发
J2EE企业分布式微服务云快速开发架构 Spring CloudSpring Boot2MybatisOauth2ElementUI 前后端分离 1. 鸿鹄Cloud架构清单 2. Commonservice(通用服务) 通用服务:对spring Cloud组件的使用&封装,是一套完整的针对于分布式微…...

软件设计师学习第一章
计算机组成与体系结构(6分) 内容概述 数据的表示 进制转换 R 进制转十进制使用按权展开法,其具体操作方式为:将 R 进制数的每一位数值用 Rk 形示,即幂的底数是 R ,指数为 k , k 与该位和小数点…...