Java中的Collections类和泛型

在Java的集合框架中,`Collections`类扮演着一个非常重要的角色。它提供了一系列对集合进行操作的静态方法,这些方法可以用于各种集合类型,如`List`、`Set`和`Map`等,从而方便我们对集合进行诸如排序、查找、反转等操作。

## 一、排序操作
1. **`sort`方法**
   - `Collections`类的`sort`方法用于对`List`类型的集合进行排序。如果列表中的元素实现了`Comparable`接口,那么可以直接使用`sort`方法进行排序。例如,我们有一个`List`存储整数:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsSortExample {
    public static void main(String[] args) {
        List<Integer> numberList = new ArrayList<>();
        numberList.add(5);
        numberList.add(2);
        numberList.add(8);
        numberList.add(1);
        Collections.sort(numberList);
        System.out.println(numberList);
    }
}
```
   - 在这个例子中,`Integer`类已经实现了`Comparable`接口,所以`sort`方法可以直接对`numberList`进行排序,输出结果为`[1, 2, 5, 8]`。

   - 如果列表中的元素没有实现`Comparable`接口,我们可以提供一个自定义的`Comparator`来定义排序规则。例如,我们有一个`List`存储自定义的`Person`对象,`Person`类没有实现`Comparable`接口:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

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;
    }
}

public class CollectionsSortWithComparatorExample {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 25));
        personList.add(new Person("Bob", 20));
        personList.add(new Person("Charlie", 30));

        // 按照年龄升序排序
        Comparator<Person> ageComparator = new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.getAge() - p2.getAge();
            }
        };
        Collections.sort(personList, ageComparator);

        for (Person person : personList) {
            System.out.println(person.getName() + " - " + person.getAge());
        }
    }
}
```
   - 在这个例子中,我们通过自定义的`Comparator`按照年龄对`Person`对象组成的`List`进行了排序。

## 二、查找操作
1. **`binarySearch`方法**
   - `Collections`类的`binarySearch`方法用于在已排序的`List`中进行二分查找。需要注意的是,在使用`binarySearch`之前,必须先对列表进行排序。例如,我们在一个已排序的整数列表中查找一个元素:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsBinarySearchExample {
    public static void main(String[] args) {
        List<Integer> sortedList = new ArrayList<>();
        sortedList.add(1);
        sortedList.add(3);
        sortedList.add(5);
        sortedList.add(7);
        sortedList.add(9);

        int index = Collections.binarySearch(sortedList, 5);
        System.out.println("元素5的索引为: " + index);
    }
}
```
   - 如果找到元素,将返回元素在列表中的索引;如果没有找到,将返回一个负数,表示如果要插入该元素以保持列表有序的话,应该插入的位置(取反后的索引 - 1)。

## 三、反转操作
1. **`reverse`方法**
   - `Collections`类的`reverse`方法用于反转`List`类型集合中的元素顺序。例如:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsReverseExample {
    public static void main(String[] args) {
        List<Integer> numberList = new ArrayList<>();
        numberList.add(1);
        numberList.add(2);
        numberList.add(3);
        numberList.add(4);

        Collections.reverse(numberList);
        System.out.println(numberList);
    }
}
```
   - 这个例子中,`numberList`中的元素顺序被反转,输出结果为`[4, 3, 2, 1]`。

## 四、其他操作
1. **`shuffle`方法**
   - `Collections`类的`shuffle`方法用于随机打乱`List`类型集合中的元素顺序。例如:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsShuffleExample {
    public static void main(String[] args) {
        List<Integer> numberList = new ArrayList<>();
        numberList.add(1);
        numberList.add(2);
        numberList.add(3);
        numberList.add(4);

        Collections.shuffle(numberList);
        System.out.println(numberList);
    }
}
```
   - 每次运行结果都会不同,因为元素被随机打乱了顺序。

2. **`max`和`min`方法**
   - 可以用于获取`Collection`中的最大和最小元素。如果集合中的元素实现了`Comparable`接口,可以直接使用这些方法。例如:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsMaxMinExample {
    public static void main(String[] args) {
        List<Integer> numberList = new ArrayList<>();
        numberList.add(5);
        numberList.add(2);
        numberList.add(8);
        numberList.add(1);

        System.out.println("最大值: " + Collections.max(numberList));
        System.out.println("最小值: " + Collections.min(numberList));
    }
}
```

`Collections`类为我们处理集合提供了很多便捷的方法,合理使用这些方法可以大大提高我们在处理集合相关问题时的效率。

# Java中的泛型

在Java编程中,泛型是一种强大的特性,它为我们提供了一种在编译时进行类型检查的机制,从而提高代码的可读性、可维护性和安全性。

## 一、什么是泛型
泛型允许我们在定义类、接口和方法时使用类型参数。这些类型参数可以在使用时被具体的类型所替代,就像模板一样。例如,我们可以定义一个简单的泛型类`Box`,它可以用来存储任何类型的对象:

```java
class Box<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}
```

在这个例子中,`T`是一个类型参数,它可以代表任何类型。当我们创建`Box`类的实例时,我们可以指定`T`代表的具体类型。

## 二、泛型的优点

### (一)类型安全
1. 在没有泛型之前,如果我们想要创建一个可以存储不同类型对象的容器类,我们可能会使用`Object`类型。例如:

```java
class OldBox {
    private Object obj;

    public void set(Object obj) {
        this.obj = obj;
    }

    public Object get() {
        return obj;
    }
}
```

使用这个`OldBox`类时,可能会出现类型不匹配的错误:

```java
OldBox box = new OldBox();
box.set("Hello");
Integer num = (Integer) box.get(); // 运行时会抛出ClassCastException
```

2. 而使用泛型的`Box`类就可以避免这种情况:

```java
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
// 下面这行代码在编译时就会报错,因为类型不匹配
// Integer num = stringBox.get();
```

### (二)代码复用
1. 泛型可以让我们编写更通用的代码。例如,我们可以创建一个泛型方法来交换数组中的两个元素:

```java
class GenericUtils {
    public static <T> void swap(T[] array, int i, int j) {
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
```

这个方法可以用于任何类型的数组,如`Integer`数组、`String`数组等:

```java
Integer[] intArray = {1, 2, 3};
GenericUtils.swap(intArray, 0, 1);
System.out.println(Arrays.toString(intArray));

String[] strArray = {"a", "b", "c"};
GenericUtils.swap(strArray, 1, 2);
System.out.println(Arrays.toString(strArray));
```

## 三、泛型的类型限制

### (一)上限类型限制
1. 有时候我们希望对泛型类型参数进行限制,例如,我们有一个方法,它只对实现了`Comparable`接口的类型有效。我们可以使用上限类型限制:

```java
class Utils {
    public static <T extends Comparable<T>> T max(T[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i].compareTo(max) > 0) {
                max = array[i];
            }
        }
        return max;
    }
}
```

这个`max`方法可以用于任何实现了`Comparable`接口的类型数组,如`Integer`数组(因为`Integer`实现了`Comparable`接口):

```java
Integer[] intArray = {3, 1, 2};
Integer max = Utils.max(intArray);
System.out.println("最大值为: " + max);
```

### (二)下限类型限制(在通配符中使用)
1. 下限类型限制在通配符中使用。例如,我们有一个方法,它可以将`Number`及其子类的集合添加到一个更大的`Number`集合中:

```java
import java.util.ArrayList;
import java.util.List;

class CollectionUtils {
    public static void addAll(List<? super Integer> dest, List<Integer> src) {
        dest.addAll(src);
    }
}

public class Main {
    public static void main(String[] args) {
        List<Number> numberList = new ArrayList<>();
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        integerList.add(2);
        CollectionUtils.addAll(numberList, integerList);
        System.out.println(numberList);
    }
}
```

在这个例子中,`? super Integer`表示`Integer`或者`Integer`的父类类型。

总之,Java中的泛型为我们提供了一种编写更安全、更通用代码的方式,它在集合框架等许多地方都有广泛的应用,是Java程序员必须掌握的重要特性之一。

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

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

相关文章

AntV X6自定义连接线样式(Vue3+TypeScript)

效果图如下&#xff1a;&#xff08;连接线是有动画的&#xff0c;模拟数据传输特效&#xff09; 核心代码&#xff1a; 在创建画布的时候即可设置连接线样式&#xff0c;通过createEdge属性即可实现&#xff0c;代码如下&#xff1a; connecting: {snap: {radius: 50, //自动吸…

工业相机详解及选型

工业相机相对于传统的民用相机而言&#xff0c;具有搞图像稳定性,传输能力和高抗干扰能力等&#xff0c;目前市面上的工业相机大多数是基于CCD&#xff08;Charge Coupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。 一&#xff0c;工业相机的分类 …

Vivado HLS学习

视频链接: 6课&#xff1a;数据类型的转换_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bt41187RW?spm_id_from333.788.videopod.episodes&vd_sourcea75d5585c5297210add71187236ec90b&p6 目录 1.数据类型的转换 2.自动类型转换 2.1隐式数据转换 2.2…

Windows安装Minio服务器端

Windows安装Minio服务器端 Windows安装Minio服务器端启动minio server将minio封装成系统服务默认账号密码常用参数 常见问题Minio为客户提供NFS调整minio文件分享时长设置“桶”为公开&#xff0c;如图设置即可 使用minio命令行客户端配置mcmc命令行常用方法创建bucket查看buck…

离散数学-逻辑与证明基础1.4(谓词和量词)

谓词 1.4.2 谓词 涉及变量的语句&#xff0c;例如&#xff1a; “ x > 3 x > 3 x>3”&#xff0c;“ x y 3 x y 3 xy3”&#xff0c;“ x y z x y z xyz” 以及 \quad “Computer x x x is under attack by an intruder” \quad “Computer x x x is f…

安装CentOS 8镜像和创建CentOS 8虚拟机教程

一、安装虚拟机 网上查找教程&#xff0c;我用的是VMware 17 二、下载CentOS 8镜像 1.阿里云下载CentOS 8镜像 centos安装包下载_开源镜像站-阿里云 (aliyun.com) 选择需要下载的版本&#xff0c;(建议)下载dvd1版本的iso&#xff08;也有下载boot版本的iso&#xff0c;创…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型&#xff08;加载预测器&#xff09;3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中&#xff0c;有shape_predictor_68_face_landmarks.dat预测器&#xff0c;这是一个…

【汇编语言】寄存器(内存访问)(二)—— DS和[address]

前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底层工作原理&#xff0c;提升代码效率&#xff0c;尤其在嵌入式系统和性能优…

day46|72. 编辑距离647. 回文子串516.最长回文子序列 5 最长回文子串

文章目录 前言72. 编辑距离思路方法一647. 回文子串思路方法一方法二516.最长回文子序列思路方法一5 最长回文子串总结前言 72. 编辑距离 思路 总体思路:dp定义直接为操作数,递推公式分情况讨论,如果两个元素相等,那操作数不变;如果不相等,那么操作数就会改变–三种情况…

免费证件照app哪个好?哪个效果比较好?

在日常生活中&#xff0c;证件照的需求无处不在&#xff0c;尤其是在求职、签证和考试等场合。 许多人可能会觉得制作证件照需要花费不少费用&#xff0c;但其实市场上有许多免费的证件照制作软件&#xff0c;能够轻松满足你的需求。 这些软件不仅操作简单&#xff0c;更具备…

如何在word里面给文字加拼音?

如何在word里面给文字加拼音&#xff1f;在现代社会&#xff0c;阅读已经成为了我们日常生活中不可或缺的一部分。尤其是在学习汉语的过程中&#xff0c;拼音的帮助显得尤为重要。为了帮助大家更好地理解和掌握汉字的发音&#xff0c;许多教师和学生都希望能够在Word文档中为文…

什么是网络代理

了解网络代理 网络代理是一种特殊的网络服务&#xff0c;它允许一个网络终端&#xff08;通常指客户端&#xff09;通过这个服务与另一个网络终端&#xff08;通常指服务器&#xff09;进行非直接的连接。网络代理服务器位于发送主机和接收主机之间&#xff0c;接收网络请求&a…

使用人体关键点驱动FBX格式虚拟人原理【详解】

文章目录 1、使用人体关键点数据驱动FBX格式虚拟人的总流程2、使用mediapipe检测人体关键点和插值平滑2.1 mediapipe检测人体关键点2.2 人体关键点的插值平滑 3、将2d关键点转为3d关键点4、旋转矩阵4.1 旋转矩阵4.2 旋转矩阵转为四元数 5、将旋转矩阵用于虚拟人的驱动5.1 基础旋…

高分SCI发文利器!植物脂质代谢数据库——CLAIR

脂质是全球重要的大宗商品和工业原料。世界上消耗的24种脂质中&#xff0c;大部分来自植物。全面了解不同油料作物中与脂质生物合成相关的基因和机制&#xff0c;对于通过分子生物学和育种来提高这些作物的含油性状至关重要。 2024年2月&#xff0c;Plant Communications在线发…

台积电Q3业绩猛增,市值破万亿美元!

KlipC报道&#xff1a;全球晶圆代工龙头台积电发布第三季度财报&#xff0c;财报显示&#xff0c;三季度营收7596.9亿新台币&#xff08;约235亿美元&#xff09;&#xff0c;同比增长39%&#xff0c;市场预期7421.66亿元新台币&#xff1b;净利润达到3252.58亿新台币&#xff…

【可答疑】基于51单片机的智能衣柜(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

云计算第四阶段: cloud二周目 07-08

cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…

汽车建模用什么软件最好?汽车建模渲染建议!

在汽车建模和渲染领域&#xff0c;选择合适的软件对于实现精确的设计与高质量的视觉效果至关重要。那么不少的汽车设计师如何选择合适的建模软件与渲染方案呢&#xff0c;一起来简单看看吧&#xff01; 一、汽车建模用软件推荐 1、Alias Autodesk旗下的Alias系列软件是汽车设…

数据结构实验十二 图的遍历及应用

数据结构实验十二 图的遍历及应用 一、【实验目的】 1、 理解图的存储结构与基本操作&#xff1b; 2、熟悉图的深度度优先遍历和广度优先遍历算法 3、掌握图的单源最短路径算法 二、【实验内容】 1.根据下图&#xff08;图见实验11&#xff09;邻接矩阵&#xff0c;编程实…

刚刚,ChatGPT推出Windows客户端!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…