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.mzph.cn/news/147062.shtml

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

相关文章

C语言之for while语句详解

C语言之for while语句详解 文章目录 C语言之for while语句详解简介1 while语句1.1while语句的格式1.2 while语句的实践 2 for2.1 for语句格式2.2 for循环的实践 3 do while3.1 do while语句格式3.2 do while循环的实践 3 循环中break和continue3.1 while语句中的break和continu…

编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。

编写程序&#xff0c;要求输入x的值&#xff0c;输出y的值。分别用&#xff08;1&#xff09;不嵌套的if语句&#xff08;2&#xff09;嵌套的if语句&#xff08;3&#xff09;if-else语句&#xff08;4&#xff09;switch语句。 选择结构是编程语言中常用的一种控制结构&…

长短期记忆(LSTM)与RNN的比较:突破性的序列训练技术

长短期记忆&#xff08;Long short-term memory, LSTM&#xff09;是一种特殊的RNN&#xff0c;主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说&#xff0c;就是相比普通的RNN&#xff0c;LSTM能够在更长的序列中有更好的表现。 Why LSTM提出的动机是为了解…

C# using语句使用介绍

在C#中&#xff0c;using语句有两种主要用途&#xff1a;一是引入命名空间&#xff0c;二是提供一种简便的方式来处理资源的清理&#xff08;主要用于实现了 IDisposable 接口的对象&#xff09;。 引入命名空间&#xff1a;using 语句用于引入命名空间&#xff0c;从而可以在代…

django理解02 前后端分离中的问题

前后端分离相对于传统方式的问题 前后端数据交换的问题跨域问题 页面js往自身程序&#xff08;django服务&#xff09;发送请求&#xff0c;这是浏览器默认接受响应 而请求其它地方是浏览器认为存在潜在危险。自动隔离请求&#xff01;&#xff01;&#xff01; 跨域问题的解决…

springcloud整合nacos实现服务注册

Nacos是一个开源的分布式系统服务和基础设施解决方案&#xff0c;用于实现动态服务发现、配置管理和服务治理。它可以帮助开发人员和运维团队更好地管理微服务架构中的服务实例、配置信息和服务调用。 Nacos提供了服务注册与发现、动态配置管理、服务路由和负载均衡等功能&…

C++之set/multise容器

C之set/multise容器 set基本概念 set构造和赋值 #include <iostream> #include<set> using namespace std;void PrintfSet(set<int>&s) {for(set<int>::iterator it s.begin();it ! s.end();it){cout<<*it<<" ";}cout&l…

typora使用PicGo自动上传图片到chevereto图床

typora使用PicGo自动上传图片到chevereto图床 近期发现&#xff0c;gitee图床不能用了。github又涉及科学上网。搜索了开源图床方案&#xff0c;找到了chevereto&#xff0c;使用起来还不错。分享给大家。 文章目录 typora使用PicGo自动上传图片到chevereto图床chevereto图床安…

精密云工程:智能激活业务速率 ——华为云11.11联合大促倒计时 仅剩3日

现新客3.96元起&#xff0c;下单有机会抽HUAWEI P60 Art&#xff0c;福利仅限双十一&#xff0c;机会唾手可得&#xff0c;立即行动&#xff01; 双十一购物节来临倒计时&#xff0c;华为云备上多款增值产品&#xff0c;以最优品质迸发冬日技术热浪&#xff0c;满足行业技术应用…

Mac 安装 protobuf 和Android Studio 使用

1. 安装,执行命令 brew install protoc 2. Mac 错误提示&#xff1a;zsh: command not found: brew解决方法 解决方法&#xff1a;mac 安装homebrew&#xff0c; 用以下命令安装&#xff0c;序列号选择中科大&#xff08;1&#xff09;或 阿里云 /bin/zsh -c "$(curl…

VB.net webbrowser 自定义下载接口实现

使用《VB.net webbrowser 如何实现自定义下载 IDownloadManager》中的控件ExtendedWebBrowser&#xff08;下载控件&#xff09;&#xff0c;并扩展了NewWindow2。 使用ExtendedWebBrowser_1过程中&#xff0c;遇到很多问题&#xff0c;花了几天时间&#xff0c;终于解决了所有…

MLC-LLM 支持RWKV-5推理以及对RWKV-5的一些思考

自从2023年3月左右&#xff0c;chatgpt火热起来之后&#xff0c;我把关注的一些知乎帖子都记录到了这个markdown里面&#xff0c;&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/large-language-model-note &#xff0c;从2023年3月左右到现…

漏洞利用工具的编写

预计更新网络扫描工具的编写漏洞扫描工具的编写Web渗透测试工具的编写密码破解工具的编写漏洞利用工具的编写拒绝服务攻击工具的编写密码保护工具的编写情报收集工具的编写 漏洞利用工具是一种常见的安全工具&#xff0c;它可以利用系统或应用程序中的漏洞来获取系统权限或者窃…

一起Talk Android吧(第五百五十二回:Retrofit的基本用法)

文章目录 1. 概念介绍2. 使用方法2.1 创建请求接口2.2 创建retrofit对象2.3 创建请求接口的对象2.4 发起请求3. 内容总结各位看官们大家好,上一回中咱们说的例子是"如何自定义SplashScreen",本章回中介绍的例子是" Retrofit的基本用法"。闲话休提,言归正…

SELinux零知识学习十三、SELinux策略语言之客体类别和许可(7)

接前一篇文章&#xff1a;SELinux零知识学习十二、SELinux策略语言之客体类别和许可&#xff08;6&#xff09; 一、SELinux策略语言之客体类别和许可 4. 客体类别许可实例 为了更好地理解许可是如何控制对系统资源的访问的&#xff0c;下面进一步讨论以下两个客体类别和许可…

python项目源码基于django的宿舍管理系统dormitory+mysql数据库文件

基于Django的宿舍管理系统 运行效果 个人亲自制作python项目源码基于django的宿舍管理系统dormitorymysql数据库文件 1. 介绍 宿舍管理系统是一个基于Django框架开发的项目&#xff0c;旨在简化和优化宿舍管理的流程。该系统包括学生和管理员两个角色&#xff0c;学生可以通过…

安装插件时Vscode XHR Failed 报错ERR_CERT_AUTHORITY_INVALID

安装插件时Vscode XHR Failed 报错ERR_CERT_AUTHORITY_INVALID 今天用vscode 安装python插件时报XHR failed,无法拉取应用商城的数据&#xff0c; 报的错如下&#xff1a; ERR_CERT_AUTHORITY_INVALID 翻译过来就是证书有问题 找错误代码的方法&#xff1a; 打开vscode, 按F1…

Swift 如何打造兼容新老系统的字符串分割(split)方法

0. 概览 在 Swift 的开发中&#xff0c;我们经常要与字符串打交道。其中一个常见的操作就是用特定的“分隔符”来分割字符串&#xff0c;这里分隔符可能不仅仅是字符&#xff0c;而是多字符组成的字符串。 从 iOS 16 开始&#xff0c; 新增了对应的方法来专注此事。不过&am…

HBase中的数据表是如何用CHAT进行分区的?

问CHA&#xff1a;HBase中的数据表是如何进行分区的&#xff1f; CHAT回复&#xff1a; 在HBase中&#xff0c;数据表是水平分区的。每一个分区被称为一个region。当一个region达到给定的大小限制时&#xff0c;它会被分裂成两个新的region。 因此&#xff0c;随着数据量的增…

【华为OD题库-026】通过软盘拷贝文件-java

题目 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。但此电脑除了有一个3.5寸软盘驱动器以外&#xff0c;没有任何手段可以将文件拷贝出来&#xff0c;而且只有一张软盘可以使用。因此这一张软盘是唯一可以用来拷贝文件的载体。科学家想要尽可能多地将计算…