集合---list接口及实现类

news2024/12/22 23:48:11

一、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));
		//indexOf
		System.out.println(list.indexOf("美国"));
		//subList
		System.out.println(list.subList(1, 3));
		//set
		list.set(list.size()-1, "日本");
		System.out.println(list);
		//remove
		list.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还是index
		System.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接口的特点,在这里得到了体现:有序、重复,可以为null
		LinkedList<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方法,方便我们来看到整体的结构
	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801177.html

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

相关文章

在linux中怎样同时运行三个微服务保证退出时不会终止

前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version&g…

RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”

RISC-V公测平台Web Server地址&#xff1a;http://175.8.161.253:8081 一、前言 Web Server是互联网应用的基础设施&#xff0c;无论是用户访问网站&#xff0c;还是后端服务提供商和开发者构建各种应用程序&#xff0c;Web Server都在其中扮演着至关重要的角色。 显而易见…

甄品焕新 | 链接上下游企业服务协同,改变服务获取方式

文/玉娇龙 本文字数&#xff1a;3500&#xff5c;预计3分钟读完 使用燕千云上下游服务管理&#xff0c;你可以统一管理IT服务供应商、业务经销商、客户等业务伙伴的服务往来&#xff0c;将企业与上下游公司之间的工单服务往来进行统一管理、共享与升级&#xff0c;实现服务共享…

jmeter接口测试、压力测试简单实现

jmeter测试的组件执行顺序&#xff1a; 测试计划—>线程组—>配置元件—>前置处理器—>定时器—>逻辑控制器—>取样器—>后置处理器—>断言—>监听器 组件的作用范围&#xff1a; 同级组件同级组件下的子组件父组件 目前市面上的三类接口 1、基…

netty 809协议

netty 809协议 目录概述需求&#xff1a; 设计思路实现思路分析1.netty 809 协议2.概念代码 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for chan…

ad+硬件每日学习十个知识点(15)23.7.26 (逻辑器件、拉电流和灌电流、OC门和OD门、总线保持)

文章目录 1.逻辑器件介绍2.什么是总线缓冲器&#xff1f;3.逻辑器件按功能分类4.逻辑器件按工艺分类&#xff08;目前主要用CMOS逻辑&#xff09;5.什么是总线保持&#xff1f;6.逻辑电平7.两个逻辑器件互连&#xff0c;需要满足什么要求&#xff1f;8.什么是推挽&#xff0c;什…

关于自签名证书授权后在哪儿看

目录 firefox可以看到 chrome and edge firefox可以看到 chrome and edge 只能从打开的网站左上角进入

读《全球科技通史》总结——历史总在重演,科技永远向前

今天和大家分享一下吴军老师的《全球科技通史》。大部分人谈到历史的时候&#xff0c;关注的是国家的兴衰、王朝的更替&#xff0c;往往忽视了科技的力量。“文津图书奖”得主吴军博士&#xff0c;从科技视角串联历史&#xff0c;首次以能量和信息两条主线&#xff0c;系统阐述…

【Docker】Docker相关基础命令

目录 一、Docker服务相关命令 1、启动docker服务 2、停止docker服务 3、重启docker服务 4、查看docker服务状态 5、开机自启动docker服务 二、Images镜像相关命令 1、查看镜像 2、拉取镜像 3、搜索镜像 4、删除镜像 三、Container容器相关命令 1、创建容器 2、查…

ad+硬件每日学习十个知识点(9)23.7.20

文章目录 1.正点原子fpga开拓者无gui检查项目2.排针连接器A2541WR-XP-2P3.肖特基二极管反接在LDO的输出端&#xff0c;是什么用&#xff1f;4.在AD中如何实现批量元器件的移动&#xff1f;5.在PCB中&#xff0c;如何让元器件以任意角度旋转&#xff1f;6.接口设计都要做静电防护…

MIT学生揭示ChatGPT完成本科课程存在问题

一个机器学习工程师发推特说&#xff1a;“这太疯狂了&#xff01;”一家专注于人工智能新闻的账号称这是一项“开创性的研究”。这项研究声称&#xff0c;ChatGPT能够以100%的准确率完成麻省理工学院的数学、计算机科学和电气工程本科课程。 它每个问题都答对了。 然而&#…

Spring:泛型依赖注入

Spring 泛型依赖注入问题解决 泛型依赖注入 泛型&#xff1a;具有占位符&#xff08;类型参数&#xff09;的类、结构、接口和方法&#xff0c;通过 <> 的方式定义了一个形式参数&#xff0c;在实例化时再指明具体类型 依赖注入&#xff1a;IoC 的具体实现&#xff0c;…

提升性能的利器:理解线程池的使用、工作原理和优势

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览2.1 为什么创建和销毁线程开销较大2.2 为什么要使…

【C++从0到王者】第十三站:vector源码分析及手把手教你如何写一个简单的vector

文章目录 一、vector的源码分析1.分析思路2.构造函数和插入接口 二、手把手教你写一个简单的vector1.基本结构2.迭代器与私有成员变量的定义3.构造函数4.size和capacity5.迭代器函数接口6.析构函数7.reserve接口8.尾插9.operator[]运算符重载10.简单的测试前面的接口11.insert以…

【Spring框架】Spring读取与存储综合练习

练习 在 Spring 项⽬中&#xff0c;通过 main ⽅法获取到 Controller 类&#xff0c;调⽤ Controller ⾥⾯通过注⼊的⽅式调⽤ Service 类&#xff0c;Service 再通过注⼊的⽅式获取到 Repository 类&#xff0c;Repository 类⾥⾯有⼀个⽅法构建⼀个 User 对象&#xff0c;返…

力扣 7月27日每日一题 2500. 删除每行中的最大值

题目连接 》2500. 删除每行中的最大值 有一句话这么说的&#xff1a;不用把人生的每一个目标都定在年龄线上&#xff0c;人生的本质是体验&#xff0c;感悟&#xff0c;和成长。什么年龄该干什么事本来就是一个伪命题。事实上&#xff0c;当你找到你热爱的东西&#xff0c;你…

C++之std::function总结(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【Docker】初识Docker以及Docker安装与阿里云镜像配置

目录 一、初识Docker 二、安装Docker 三、Docker架构 四、配置Docker镜像加速器 一、初识Docker Docker是一个开源的应用容器引擎&#xff0c;诞生于2013年&#xff0c;基于Go语言实现&#xff0c;dotCloud公司出品&#xff0c;Docker开源让开发者打包他们的应用以及依赖包到…

SpringMVC-mybatis,SQL语句中误用了desc关键字,导致报错。

17-Jul-2023 21:26:22.295 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath 17-Jul-2023 21:26:22.621 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalin…