资深大佬养成之路:Java中关于List集合选择与使用(二)

本系列文章简介:

        作为一个Java程序员,我们经常会遇到需要处理大量数据的情况。而在处理数据时,我们常常需要使用到集合这种数据结构。而在集合中,List是最常用的一种。

        List是一种有序的集合,它可以存储任意类型的对象,并且允许重复元素。在Java中,List是一个接口,它有多个实现类,如ArrayList、LinkedList等

        List集合有许多强大的功能,例如可以动态地添加、删除和修改元素,可以根据索引访问元素,还可以对集合进行排序、查找和过滤等操作。因此,熟练掌握List集合的使用是每个资深Java程序员的必备技能。

        在本系列文章中,我们将深入学习Java中List集合的选择与使用。我们将从最基础的ArrayList开始,学习如何创建一个List集合、如何添加、删除和修改元素,如何使用迭代器和for-each循环遍历集合等。然后,我们将进一步学习LinkedList这种特殊的List实现类,了解它的特点和用途。

        除此之外,我们还将学习如何对List集合进行排序操作,以及如何使用Java 8中引入的Stream API对List集合进行过滤和映射等操作。这些都是每个Java程序员需要掌握的重要技巧。

        通过学习本系列文章,相信你将能够熟练地使用List集合,并能够解决实际工作中遇到的各种问题。希望本系列文章能够帮助你在Java程序开发的道路上取得更大的成就!

        欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

1、前言

2、List集合的排序

2.1 使用Collections.sort方法进行排序

2.2 使用Comparator自定义排序规则

2.3 使用Comparable接口实现自然排序

3、List集合的常见问题和解决方法

3.1 如何判断两个List集合是否相等

3.2 如何根据元素属性在List集合中查找元素

3.3 如何去重List集合中重复的元素

3.4 如何将List集合转换为数组

4、结语


1、前言

        List集合是一种常见的数据结构,它可以存储多个元素,并且元素的顺序是有序的。List集合允许元素重复,并且可以根据索引位置对元素进行访问和操作。

        本文将跟随《资深大佬养成之路:Java中关于List集合选择与使用(一)》的进度,继续介绍 List集合。希望通过本系列文章的学习,您将能够更好地理解 List集合的内部工作原理,掌握 List集合的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化 List集合的潜力,为系统的高效运行提供有力保障。

2、List集合的排序

2.1 使用Collections.sort方法进行排序

使用Collections.sort方法进行排序的步骤如下:

  1. 创建一个List对象,该List对象包含需要排序的元素。
  2. 调用Collections.sort方法,将排序的List对象作为参数传入。
  3. 根据需要进行排序的条件,实现Comparator接口或使用Comparable接口。
  4. 在Comparator接口中,重写compare方法来定义排序规则。
  5. 调用Collections.sort方法进行排序。

以下是一个使用Collections.sort方法进行排序的示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortExample {public static void main(String[] args) {// 创建一个包含需要排序的元素的List对象List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");list.add("Grape");// 调用Collections.sort方法进行排序Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {// 根据字母顺序进行排序return o1.compareTo(o2);}});// 打印排序后的结果for (String fruit : list) {System.out.println(fruit);}}
}

运行上面的代码,将会输出以下结果:

Apple
Banana
Grape
Orange

这里使用了一个匿名类实现了Comparator接口,重写了compare方法来定义排序规则。在这个例子中,排序按照字母的升序进行排序。

2.2 使用Comparator自定义排序规则

你可以使用java.util.Comparator接口来自定义排序规则。以下是一个示例:

假设有一个Person类,其中有两个属性:name(姓名)和age(年龄)。现在想按照年龄对Person对象进行排序。可以创建一个名为AgeComparator的类来实现Comparator接口,并重写其中的compare方法。

import java.util.Comparator;public class AgeComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {if (p1.getAge() > p2.getAge()) {return 1;} else if (p1.getAge() < p2.getAge()) {return -1;} else {return 0;}}
}

然后,可以在使用排序方法时传递AgeComparator对象来指定排序规则。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class Main {public static void main(String[] args) {List<Person> persons = new ArrayList<>();persons.add(new Person("Alice", 25));persons.add(new Person("Bob", 20));persons.add(new Person("Charlie", 30));Collections.sort(persons, new AgeComparator());for (Person person : persons) {System.out.println(person.getName() + " - " + person.getAge());}}
}

输出结果:

Bob - 20
Alice - 25
Charlie - 30

在这个例子中,AgeComparator类实现了Comparator接口,并重写了compare方法。在compare方法中,根据两个Person对象的年龄进行比较。然后,将AgeComparator对象传递给Collections.sort方法,以指定排序规则。最后,按照年龄对Person对象进行排序,并输出结果。

2.3 使用Comparable接口实现自然排序

要实现自然排序,需要做以下几个步骤:

        1. 在类上实现Comparable接口,并指定泛型参数为自身类名。例如,如果要对一个类Person进行自然排序,可以这样实现:

public class Person implements Comparable<Person> {// 类的其他成员变量和方法@Overridepublic int compareTo(Person other) {// 根据需要的排序逻辑,比较自身和另一个对象的大小并返回结果// 返回负数表示自身小于other,返回0表示相等,返回正数表示自身大于other}
}

        2. 在compareTo方法中实现比较逻辑。根据自己的需求,比较对象的某些属性,确定对象的大小关系。

例如,如果想要按照年龄进行排序,可以这样实现:

@Override
public int compareTo(Person other) {return this.age - other.age;
}

        3. 在使用自然排序的地方,直接调用Collections.sort()方法或Arrays.sort()方法进行排序,即可按照自然排序规则进行排序。

例如,如果有一个Person对象的列表,想要按照自然排序规则进行排序,可以这样实现:

List<Person> personList = new ArrayList<>();
// 添加Person对象到personList中Collections.sort(personList);
// personList中的Person对象会按照自然排序规则进行排序

注意:在比较对象的属性时,需要确保属性的比较逻辑是一致的,否则可能造成排序结果不符合预期。

3、List集合的常见问题和解决方法

3.1 如何判断两个List集合是否相等

判断两个List集合是否相等可以通过以下方法:

  1. 首先判断两个集合的长度是否相等,如果长度不相等,则两个集合肯定不相等。

  2. 接下来可以使用containsAll()方法判断两个集合是否包含相同的元素。containsAll()方法会判断一个集合是否包含另一个集合的所有元素,如果包含则返回true,不包含则返回false。

  3. 此外,还可以使用equals()方法判断两个集合是否相等。equals()方法会判断两个集合是否包含相同的元素且元素的顺序也相同。

示例代码如下:

List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> list2 = new ArrayList<>(Arrays.asList(1, 2, 3));if (list1.size() != list2.size()) {System.out.println("两个集合不相等");
} else if (list1.containsAll(list2)) {System.out.println("两个集合相等");
} else {System.out.println("两个集合不相等");
}// 或者使用equals()方法判断
if (list1.equals(list2)) {System.out.println("两个集合相等");
} else {System.out.println("两个集合不相等");
}

注意:使用containsAll()方法和equals()方法时,需要保证集合中的元素都正确地实现了equals()方法。

3.2 如何根据元素属性在List集合中查找元素

在Java中,可以使用Stream API和Lambda表达式来根据元素属性在List集合中查找元素。

假设有一个Person类,具有属性name和age,我们要根据name属性在List<Person>集合中查找元素。

首先,要使用Stream API将List转换为Stream流,然后使用filter()方法根据条件过滤元素,最后使用findFirst()方法查找第一个满足条件的元素。

下面是代码示例:

import java.util.List;
import java.util.Optional;public class Main {public static void main(String[] args) {List<Person> personList = List.of(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 35));String nameToFind = "Bob";Optional<Person> foundPerson = personList.stream().filter(person -> person.getName().equals(nameToFind)).findFirst();if (foundPerson.isPresent()) {System.out.println("Found person: " + foundPerson.get());} else {System.out.println("Person not found");}}
}class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

运行以上代码,会输出:

Found person: Person{name='Bob', age=30}

如果没有找到满足条件的元素,会输出:

Person not found

可以根据需要修改条件和属性来查找不同的元素。

3.3 如何去重List集合中重复的元素

Java中可以通过以下几种方法去重List集合中的重复元素:

        1. 使用Set:将List集合转换为Set集合,Set集合不允许有重复元素,然后再将Set集合转换回List集合。

List<Integer> list = new ArrayList<>();
// 添加元素到List集合
...
Set<Integer> set = new HashSet<>(list);
List<Integer> newList = new ArrayList<>(set);

        2. 使用Java 8的Stream API:利用Stream的distinct方法去掉重复元素,然后使用collect方法将结果转换回List集合。

List<Integer> list = new ArrayList<>();
// 添加元素到List集合
...
List<Integer> newList = list.stream().distinct().collect(Collectors.toList());

        3. 使用循环遍历:使用双重循环遍历List集合,将重复的元素移除。

List<Integer> list = new ArrayList<>();
// 添加元素到List集合
...
for (int i = 0; i < list.size(); i++) {for (int j = i + 1; j < list.size(); j++) {if (list.get(i).equals(list.get(j))) {list.remove(j);j--;}}
}

3.4 如何将List集合转换为数组

在Java中,可以使用toArray()方法将List集合转换为数组。

示例代码如下:

import java.util.ArrayList;
import java.util.List;public class ListToArrayExample {public static void main(String[] args) {// 创建一个List集合List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 将List集合转换为数组String[] array = list.toArray(new String[0]);// 打印数组元素for (String element : array) {System.out.println(element);}}
}

上述代码会输出以下结果:

Apple
Banana
Orange

toArray()方法中,我们需要传入一个数组作为参数。如果传入的数组长度小于List集合的长度,那么toArray()方法会创建一个新的数组,并将List集合的元素复制到新的数组中。如果传入的数组长度大于或等于List集合的长度,那么toArray()方法会将List集合的元素复制到传入的数组中,并将多余的数组元素置为null。如果传入的数组长度为0,则会返回一个具有与List集合相同元素的新数组。

4、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

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

相关文章

基于react native的原生iOS 微信登录

基于react native的原生iOS 微信登录 引入SDK&#xff1a;WechatOpenSDK-XCFramework.xcframeworkios 创建CustomerWxLogin类CustomerWxLogin.hCustomerWxLogin.m react native端调用创建wxLogin.js用于架起桥梁连接ios原生代码在页面中使用 微信open SDK 引入SDK&#xff1a;W…

Flutter 与Android 原生通信的3种基本方式的使用

一、Flutter 与 原生通信的三种基本方式以及使用场景 1.MethodChannel 主要是用于Flutter调用原生的方法(执行一个原生的行为更合适) 2.BasicMessageChannel 用于Flutter Native双向流式通信 3.EventChannel 主要用于Native平台单独向Flutter发送事件消息流,更强调单向用…

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求&#xff1a; 有这几个就行&#xff0c;门店名称门店地址门店类型&#xff0c;再加上省、市、县/区门店名称&#xff1a;storeName 门店地址&#xff1a;storeAddress 程序运行&#xff1a; honor_spider获取经纬度信息。 经纬度——>详…

「PHP系列」PHP 命名空间详解

文章目录 一、PHP命名空间1. 声明命名空间2. 使用命名空间3. 命名空间的作用范围4. 子命名空间5. 全局命名空间和非命名空间代码6. 命名空间与自动加载 二、PHP命名空间使用1. 基本使用2. 子命名空间3. 全局函数和常量4. 结合自动加载 三、相关链接 一、PHP命名空间 PHP 的命名…

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境&#xff0c;并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店&#xff0c;在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS&#xff1a;Clang这个插件别安装&…

【电路笔记】-逻辑或非门

逻辑或非门 文章目录 逻辑或非门1、概述2、晶体管逻辑或非门3、数字逻辑或非门类型4、通用或非门逻辑或非门是数字逻辑或门与反相器或非门串联的组合。 1、概述 或非(Not-OR)门的输出通常为逻辑电平“1”,并且仅当其任何输入处于逻辑电平“1”时才变为“低”至逻辑电平“0”…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块…

力扣HOT100 - 73. 矩阵置零

解题思路&#xff1a; 题目要求使用原地算法 在原地算法中&#xff0c;输入数据通常在内存中直接被修改&#xff0c;而不需要额外的辅助数据结构来存储中间结果。原地算法的一个常见应用是在数组或列表上进行操作&#xff0c;而不是创建新的数组或列表来存储结果。 class So…

bash的login shell与non-login shell,以及各自的初始化过程

识别login shell与non-login shell login shell 可能是以-开头的 [almalinuxVM-AlmaLinux8-tmpl-wanlinwang ~]$ echo $0 -bash # "-" is the first character. Therefore, this is a login shell.或者以--login启动的bash [almalinuxVM-AlmaLinux8-tmpl-wanlinw…

Python自动打开Excel文件

导入必要的模块 import os import subprocess编写打开文件的函数 def open_file(file_path):"""打开指定路径下的文件。参数&#xff1a;file_path (str): 文件的路径。"""if os.name "nt": # 如果是 Windows 系统os.startfile(fi…

js面试---数据类型

1、js有哪些数据类型&#xff1f;有什么区别 js一共有Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt&#xff0c;八种数据类型。 Symbol&#xff1a;ES6新增数据类型&#xff0c;代表创建后独一无二且不可变的数据类型&#xff0c;主要是为了解决可能出现…

【截至2023年底】语言模型的发展

什么是大语言模型LLM&#xff1f;ChatGPT、LLAMA各自有什么优势&#xff1f; from&#xff1a; https://www.youtube.com/watch?vt6qBKPubEEo github&#xff1a; https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey&#xff0c;但据说还在更新&#xff0c;到…

数据结构——线性表(顺序存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

设置MariaDB,创建新库,新用户并授权其可以从任何主机登录

OS:CENTOS 7 1、从系统进入MariaDB # mysql -u root -p 这里的root是指MariaDB的管理员用户&#xff0c;和系统的root不搭边&#xff0c;只是同名而已。 2、看下有哪些库、用户 MariaDB [(none)]> show databases; MariaDB [(none)]>select user,host from mysql.us…

MySQL:关于数据库的一些练习题

文章目录 前面的内容已经把数据库的一些必要知识已经储备好了&#xff0c;因此下面就对于这些语句进行一些练习&#xff1a; 批量插入数据 insert into actor values (1, PENELOPE, GUINESS, 2006-02-15 12:34:33), (2, NICK, WAHLBERG, 2006-02-15 12:34:33);SQL202 找出所有…

学习R语言第二天

R语言可以做什么 1.数据分析 R语言如何使用 1. 请看我的操作方式 2. 如何获取当前路径 -- 获取当前路径 > getwd() [1] "E:/R/RWorkSpace/day01" -- 修改当前路径 > setwd(dir "E:/R") > getwd() [1] "E:/R" 3.查看当下数据值的信…

java的this关键字 and 构造器

文章目录 构造器构造器的特点this关键字举个例子吧其他链接 不难理解&#xff0c;so easy!!! 构造器 People people new People(); // People类型&#xff1a;决定着对象的类型&#xff08;在内存中的构造形式&#xff09; // people对象名称&#xff0c;在栈内存当中 // new…

UT单元测试

Tips&#xff1a;在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的&#xff0c;模拟的&#xff0c;虚假的。对于测试框架来说&#xff0c;即构造出一个模拟/虚假的对象&#xff0c;使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…

Android 允许其他应用读取本应用的私有目录

在Android中&#xff0c;应用默认是封闭的&#xff0c;不允许其他应用访问自己的私有目录。但是&#xff0c;如果你想要让其他应用能够访问你的应用中的某些文件&#xff0c;你可以使用FileProvider类来实现这一功能。 以下是使用FileProvider的步骤&#xff1a; 1. 在你的应…

SAP Fiori开发中的JavaScript基础知识12 - 闭包,模块模式,回调函数

1. 前言 本文将介绍JavaScript中几个高阶的知识点&#xff1a;闭包&#xff0c;模块和回调。 2. 闭包 在JavaScript中&#xff0c;闭包是一个非常强大的特性&#xff0c;它允许函数记住并访问它的词法作用域&#xff0c;即使它在词法作用域之外执行。 简单来说&#xff0c;…