首页 > 编程语言 >Java中的Collections类和泛型

Java中的Collections类和泛型

时间:2024-10-18 14:21:19浏览次数:3  
标签:java List 类和泛 util add Collections numberList Java public

在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程序员必须掌握的重要特性之一。

标签:java,List,类和泛,util,add,Collections,numberList,Java,public
From: https://blog.csdn.net/2301_77081232/article/details/143052634

相关文章

  • Java爬虫:获取商品评论数据的高效工具
    在电子商务的激烈竞争中,商品评论作为消费者购买决策的重要参考,对于商家来说具有极高的价值。它不仅能够帮助商家了解消费者的需求和反馈,还能作为改进产品和服务的依据。Java爬虫技术,以其稳健性和高效性,成为了获取商品评论数据的理想选择。本文将介绍如何使用Java爬虫API获取商......
  • java计算机毕业设计“阴阳师”游戏玩家社区设计与实现(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着互联网技术的飞速发展,游戏产业迎来了蓬勃发展的黄金时期,其中移动游戏更是占据了重要的市场份额。《阴阳师》作为一款极具人气的手机游戏,吸引......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-3-启动浏览器(详细教程)
    1.简介 通过前边两篇文章跟随宏哥学习想必到这里已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动两大浏览器。按市场份额来说,全球前三大浏览器是:IE.Firefox.Chrome。但是微软已经在Win10中不维护IE浏览器了,用Edge浏览器代替或者兼容IE模式的浏览器,因此宏哥这......
  • 堆——java中优先队列(下)
    堆984.不含AAA或BBB的字符串classSolution{publicStringstrWithout3a3b(inta,intb){StringBufferstr=newStringBuffer();while(a>0&&b>0){if(a>b){str.append("aab");......
  • java+vue计算机毕设公交车辆保修信息系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,公共交通系统作为城市运转的重要动脉,其运营效率和服务质量直接关系到市民的日常出行体验与城市的整体形象。公交车辆作为公共交......
  • java+vue计算机毕设个人微博网站【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展,社交媒体已成为人们日常生活中不可或缺的一部分。微博,作为一种短小精悍、即时分享的信息传播平台,凭借其独特的魅力和广泛的......
  • java+vue计算机毕设高校快递驿站废品回收系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和高校师生对网购需求的日益增长,高校快递驿站已成为校园内不可或缺的物流节点。然而,在快递业务量激增的同时,也带来了大量的包......
  • 计算机专业 Java 方向学生的技能提升与求职准备
    一、引言作为一名还有一年即将毕业的计算机专业学生,面对竞争激烈的就业市场,提前做好规划和准备至关重要。尤其对于主要学习语言为Java的我们来说,如何在这一年中有效地提升自己的技能,为顺利找到理想的工作打下坚实的基础,是当前需要认真思考和积极行动的问题。二、自我评估(一)现......
  • 基于Springboot的宠物商城网站系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的宠物商城网站系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统......
  • 基于Springboot的基于协同过滤算法商品推荐系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的基于协同过滤算法商品推荐系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结......