6.2 List和Set接口

1. List接口

List接口继承自Collection接口,List接口实例中允许存储重复的元素,所有的元素以线性方式进行存储。在程序中可以通过索引访问List接口实例中存储的元素。另外,List接口实例中存储的元素是有序的,即元素的存入顺序和取出顺序一致。

1.1. List接口的常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引操作集合的特有方法。List接口的常用方法如下表所示。

方法声明

功能描述

void add(int index,Object element)

将元素element插入List的index索引处

boolean addAll(int index,Collection c)

将集合c所包含的所有元素插入到List集合的index索引处

Object get(int index)

返回集合index索引处的元素

Object remove(int index)

删除index索引处的元素

Object set(int index, Object element)

将index索引处元素替换成element对象,并将替换后的元素返回

int indexOf(Object o)

返回对象o在List中第一次出现的位置索引

int lastIndexOf(Object o)

返回对象o在List中最后一次出现的位置索引

List subList(int fromIndex, int toIndex)

返回从索引fromIndex(包括)到 toIndex(不包括)处所有元素集合组成的子集合

1.2. ArrayList

ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。ArrayList集合内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

public class TestDemo {@Testpublic void test(){ArrayList list = new ArrayList();   // 创建ArrayList集合list.add("张三");                // 向集合中添加元素list.add("李四");list.add("王五");list.add("赵六");System.out.println("集合的长度:" + list.size());     //获取集合中元素的个数System.out.println("第2个元素是:" + list.get(1));   //取出并打印指定位置的元素list.remove(3);                                 //删除索引为3的元素System.out.println("删除索引为3的元素:"+list);list.set(1,"李四2");                             //替换索引为1的元素为李四2System.out.println("替换索引为1的元素为李四2:"+list);}}

1.3. ArrayList练习

ArrayList存储多个学生信息(学生信息包含name和age属性),然后for循环输出学生信息。

  • Student类

public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • 测试类

public class TestDemo {@Testpublic void test(){Student stu1 = new Student();stu1.setName("张三");stu1.setAge(20);Student stu2 = new Student();stu2.setName("李四");stu2.setAge(22);ArrayList list = new ArrayList();list.add(stu1);list.add(stu2);for(int i=0;i<list.size();i++){Student stu = (Student) list.get(i);System.out.println(stu);}}}

1.4. LinkedList

由于ArrayList集合的底层是使用一个数组来存储元素,在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此Arraylist集合不适合做大量的增删操作,而适合元素的查找。为了克服ArrayList集合在查询元素时速度很快,但在增删元素时效率较低的局限性,可以使用List接口的另一个实现类LinkedList。

LinkedList集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式记录它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所以LinkedList集合增删效率非常高。

(1)LinkedList集合添加、删除元素过程如下图所示。

(2)LinkedList案例

public class TestDemo {@Testpublic void test(){LinkedList link = new LinkedList();   // 创建LinkedList集合link.add("张三");link.add("李四");link.add("王五");link.add("赵六");System.out.println(link.toString());  // 获取并打印该集合中的元素link.add(3, "Student");           // 向link集合中索引3处插入元素Studentlink.addFirst("First");            // 向link集合第一个位置插入元素FirstSystem.out.println(link);System.out.println(link.getFirst());  // 取出link集合中第一个元素link.remove(3);                 // 移除link集合中指定索引位置为3的元素link.removeFirst();              // 移除link集合中第一个元素System.out.println(link);}}

1.5. LinkedList练习

LinkedList存储多个学生信息(学生信息包含name和age属性),然后for循环输出学生信息。

  • Student类

public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • 测试类

public class TestDemo {@Testpublic void test(){Student stu1 = new Student();stu1.setName("张三");stu1.setAge(20);Student stu2 = new Student();stu2.setName("李四");stu2.setAge(22);LinkedList list = new LinkedList();list.add(stu1);list.add(stu2);for(int i=0;i<list.size();i++){Student stu = (Student) list.get(i);System.out.println(stu);}}}

2. 集合遍历

Iterator接口是Java集合框架中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(遍历)Collection中的元素,通常情况下Iterator对象也被称为迭代器。

2.1. 迭代器迭代元素过程

迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。迭代器迭代元素过程如下图所示。

注意:通过迭代器获取ArrayList集合中的元素时,这些元素的类型都是Object类型,如果想获取到特定类型的元素,则需要进行对数据类型强制转换。

2.2. 迭代器案例

public class TestDemo {@Testpublic void test(){ArrayList list = new ArrayList();   // 创建ArrayList集合list.add("张三");                // 向该集合中添加字符串list.add("李四");list.add("王五");list.add("赵六");Iterator it = list.iterator();        // 获取Iterator对象while (it.hasNext()) {           // 判断ArrayList集合中是否存在下一个元素Object obj = it.next();       // 取出ArrayList集合中的元素System.out.println(obj);}}}

2.3. 迭代器练习

ArrayList存储多个学生信息,然后使用Iterator遍历输出学生信息。

  • Student类

public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • 测试类

public class TestDemo {@Testpublic void test(){Student stu1 = new Student();stu1.setName("张三");stu1.setAge(20);Student stu2 = new Student();stu2.setName("李四");stu2.setAge(22);ArrayList list = new ArrayList();list.add(stu1);list.add(stu2);//遍历Iterator it = list.iterator();while (it.hasNext()){Student stu = (Student) it.next();System.out.println(stu);}}}

3. Set接口

3.1. Set接口概述

Set接口也继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充。与List接口不同的是,Set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复。

Set接口常见的实现类有3个,分别是HashSet、LinkedHashSet、TreeSet。其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能;LinkedHashSet是链表和哈希表组合的一个数据存储结构;TreeSet则是以二叉树的方式存储元素,它可以对集合中的元素进行排序。

3.2. HashSet

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的。当向HashSet集合中添加一个元素时,首先会调用该元素的hashCode()方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素。Set集合与List集合存取元素的方式都一样,但是Set集合中的元素是无序的。

(1)HashSet案例

public class TestDemo {@Testpublic void test(){HashSet hset = new HashSet();   // 创建HashSet集合hset.add("张三");             // 向该Set集合中添加字符串hset.add("李四");hset.add("王五");hset.add("李四");             // 向该Set集合中添加重复元素Iterator it = hset.iterator();      // 获取Iterator对象while (it.hasNext()) {         // 通过while循环,判断集合中是否有元素Object obj = it.next();    // 如果有元素,就调用迭代器的next()方法获取元素System.out.println(obj);}}}

(2)HashSet存储元素的流程

当调用HashSet集合的add()方法存入元素时,首先调用HashSet集合的hashCode()方法获得元素对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入。如果该位置上有元素存在,则会调用equals()方法让当前存入的元素和该位置上的元素进行比较,如果返回的结果为false,就将该元素存入集合,返回的结果为true,则说明有重复元素,就将需要存入的重复元素舍弃。

(3)HashSet存储自定义对象

HashSet存储多个学生信息,然后使用Iterator遍历输出学生信息。

注意:HashSet中如果去掉地址不同但是内容相同的Student的重复元素,需要定义在Student类时重写hashCode()和equals()方法。

  • Student类

public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
  • 测试类

public class TestDemo {@Testpublic void test(){Student stu1 = new Student();stu1.setName("张三");stu1.setAge(20);Student stu2 = new Student();stu2.setName("李四");stu2.setAge(22);Student stu3 = new Student();stu3.setName("李四");stu3.setAge(22);HashSet hset = new HashSet();   // 创建HashSet集合hset.add(stu1);hset.add(stu2);hset.add(stu3);Iterator it = hset.iterator();  // 获取Iterator对象while (it.hasNext()) {Object obj = it.next();System.out.println(obj);}}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建成功simulink-stm32硬件在环开发环境

本次实验所使用的软件版本和硬件平台参数如下&#xff1a; Matlab版本: 2021b STM32硬件平台&#xff1a;YF_STM32_Alpha 1R4(参考自STM32 Nucleo F103RB官方开发板) YF_STM32_Alpha开发板 STM32 Nucleo F103RB 开发板 2.1 STM32硬件支持包下载 读者朋友平时使用的是和谐版M…

洗眼镜超声波清洗机用什么水清洗、小型超声波清洗机推荐

洗眼镜的超声波清洗机可以用清水清洗&#xff0c;因为超声波频率可以把眼镜缝隙中的脏污渍给振动出来&#xff0c;所以清水槽内放清水就可以了。像清洗一些机器零件的话&#xff0c;污渍比较重可以适当的家电清洁液进去清洗&#xff0c;这样清洗完的效果会比较好。戴眼镜的朋友…

Adobe家里的“3D“建模工 | Dimension

今天&#xff0c;我们来谈谈一款在Adobe系列中比肩C4D的高级3D软件的存在—— Dimension。 Adobe Dimension &#xff0c;其定位是一款与Photoshop以及Illustrator相搭配的3D绘图软件。 Adobe Dimensions与一般的3D绘图软件相较之下&#xff0c;在操作界面在功能上有点不大相同…

SDL2 播放音频数据(PCM)

1.简介 这里以常用的视频原始数据PCM数据为例&#xff0c;展示音频的播放。 SDL播放音频的流程如下&#xff1a; 初始化音频子系统&#xff1a;SDL_Init()。设置音频参数&#xff1a;SDL_AudioSpec。设置回调函数&#xff1a;SDL_AudioCallback。打开音频设备&#xff1a;SD…

NewStarCTF2023 Reverse Week3---Let‘s Go Wp

分析 程序打开后结合题目可以发现是 GO语言。 在GO语言中&#xff0c;main_init 要先于 main 函数运行。 在这里对一个iv做了处理。 用插件Signsrch发现AES加密 知道是AES后&#xff0c;就需要找密文&#xff0c;key和iv了。 密文应该就是前面的十六进制字符串。 key和i…

二百零三、Flume——Flume实时采集数据频率为1s的高频率Kafka数据直接写入ODS层表的HDFS文件路径下

一、目的 在离线数仓中&#xff0c;需要用Flume去采集Kafka中的数据&#xff0c;然后写入HDFS中。 由于每种数据类型的频率、数据大小、数据规模不同&#xff0c;因此每种数据的采集需要不同的Flume配置文件。玩了几天Flume&#xff0c;感觉Flume的使用难点就是配置文件 二、…

医疗项目的需求分析以及开发流程

一.项目的背景以及需求 1.项目背景 1.政策层面来看&#xff0c;近年来我国政府相关部门陆续颁发了支持数字医疗行业发展的相关政策&#xff0c;“互联网医疗”政策逐渐明确完善&#xff0c;为数字医疗行业发展提供支持&#xff0c;行业迎来政策福利期。 其次&#xff0c;从经济…

熟悉 Unity HDRP设置以提高性能

HDRP Version 10 了解如何利用高清晰度渲染管道(HDRP)设置&#xff0c;以最大限度地提高性能&#xff0c;并一次实现强大的图形。 随着Unity 2020 LTS及以后的HDRP版本10的发布&#xff0c;HDRP包继续优先考虑其用户友好的界面&#xff0c;灵活的功能&#xff0c;稳定性和总体…

第3章:搜索与图论【AcWing】

文章目录 图的概念图的概念图的分类有向图和无向图 连通性连通块重边和自环稠密图和稀疏图参考资料 图的存储方式邻接表代码 邻接矩阵 DFS全排列问题题目描述思路回溯标记剪枝代码时间复杂度 [N 皇后问题](https://www.luogu.com.cn/problem/P1219)题目描述全排列思路 O ( n ! …

什么是美国服务器,有哪些优势,适用于什么场景?

​  在互联网发展的过程中&#xff0c;服务器扮演着至关重要的角色。而美国作为全球信息技术的中心&#xff0c;其服务器在全球范围内受到广泛关注。  美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…

《视觉SLAM十四讲》-- 后端 2

文章目录 09 后端 29.1 滑动窗口滤波和优化9.1.1 实际环境下的 BA 结构9.1.2 滑动窗口法 9.2 位姿图9.2.1 位姿图的意义9.2.2 位姿图优化 09 后端 2 9.1 滑动窗口滤波和优化 9.1.1 实际环境下的 BA 结构 由于计算机算力的限制&#xff0c;我们必须控制 BA 的规模&#xff0c…

Perl的LWP::UserAgent库爬虫程序怎么写

Perl的LWP::UserAgent库是一个用于发送HTTP请求的Perl模块。它可以用于编写Web爬虫、测试Web应用程序、自动化Web操作等。以下是一个简单的使用LWP::UserAgent库发送HTTP GET请求的Perl脚本的例子&#xff1a; #!/usr/bin/perluse strict; use warnings; use LWP::UserAgent;# …

WPF中的虚拟化是什么

WPF&#xff08;Windows Presentation Foundation&#xff09;中的虚拟化是一种性能优化技术&#xff0c;它主要用于提高大量数据展示的效率。在WPF中&#xff0c;如果你有一个包含大量项的ItemsControl&#xff08;例如ListBox、ListView或DataGrid等&#xff09;&#xff0c;…

从CentOS向KeyarchOS操作系统的wordpress应用迁移实战

文章目录 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战一、使用浪潮信息X2Keyarch迁移工具完成操作系统的迁移1.1 迁移前的验证1.2 执行迁移评估1.3 开始迁移1.4 验证迁移结果1.5 迁移后的验证 二、总结 从CentOS向KeyarchOS操作系统的wordpress应用迁移实战 CentOS是一…

【网络】TCP协议的相关实验

TCP协议的相关实验 一、理解listen的第二个参数1、实验现象2、TCP 半连接队列和全连接队列3、关于listen的第二个参数的一些问题4、SYN洪水Ⅰ、什么是SYN洪水攻击Ⅱ、如何解决SYN洪水攻击&#xff1f; 二、使用Wireshark分析TCP通信流程 一、理解listen的第二个参数 在编写TCP…

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…

千梦网创:实现自动化“挂机躺盈”的三种方法

在互联网众多行业中&#xff0c;有很多人一直在寻找所谓的“挂机躺盈”的项目&#xff0c;在理财领域这种收入被称为“被动收入”。 天上不会掉馅饼这是一句讲烂掉的话了&#xff0c;躺在家里吃白食等着钱进账是一件不可能的事情。 然而如果你看到身边有“被动收入”的例子&a…

侧面多级菜单(一个大类、一个小类、小类下多个物体)

效果&#xff1a; 说明&#xff1a; 左右侧面板使用Animator组件控制滑入滑出。左侧面板中&#xff0c;左的左里面是大类&#xff0c;左的右有绿色的小类&#xff0c;绿色的小类下有多个真正的UI图片按钮。 要点&#xff1a; 结合了一点EasyGridBuilderPro插件的UI元素&…

leetcode算法之前缀和

目录 1.DP34[模板]一维前缀和2.DP35[模板]二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为K的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和 1.DP34[模板]一维前缀和 一维前缀和 #include <iostream> #include <vector> using namespace std…

基于 React 的 HT for Web ,由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互

本心、输入输出、结果 文章目录 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互前言什么是 HT for WebHT for Web 的特点如何使用 HT for Web相关链接弘扬爱国精神 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维…