在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