Collections类是java中提供的一个工具类,它和接口Collection乍一看非常相像,但是二者的区别是非常大的,最明显的就是它们一个是类,而另一个是接口了。Collections工具类的作用是对Set 、Map、 List这些容器提供辅助方法来对容器中的元素进行排序、填充、查找等操作。
在Collecctions工具类中的方法是极多的,三言两语难以说尽,因此这里我们只简单介绍几个常用的方法,对Collections工具类有个认识即可,对于不常用的方法,用到时进行简单类比即可。Collections工具类中的所有方法均为静态方法,因此在使用时只需要通过类名就可以对对应的方法进行进行调用。在Collections类中,我们常用的方法有sort、shufle、reverse、fill以及binnarySearch。这几个方法的具体作用如下:
void sort(List):对List容器内的元素进行排序,排序规则按照升序;
void shufle(List):对List容器内的元素进行随机排列;
void reverse(List):对List容器内的元素进行逆序排列;
void fill(List):用一个特定的对象重写整个List容器;
int binnarySearch(List,Object):对于顺序的List容器,采用折半查找的方法查找指定对象,并返回该对象的索引。
以上介绍的几个方法都是对List接口来说的因此在它们的参数中都需要传入一个List类型的容器。接下来我们演示这几个方法当中的前两个来说命Collections类的使用,其余的方法除了功能不同,用法是基本一样的。首先创建一个CollectionsTest类,在这个类中实例化一个List型容器list。容器list的泛型类型为String,因此添加的元素只能是String类型。将a,b,c,d乱序添加进容器list中,并遍历容器list中的元素,用作对照。
由于Collections类中的方法均为静态方法,因此使用当中用的方法直接通过类名调用即可。通过Colkections调用sort方法,并将list作为参数传入。当我们再次遍历容器list中的元素是会发现元素的顺序从c、b、d、a变成了a、b、c、d。这就是sort的排序效果。
需要说明的是,上面的这个排序操作是按照默认排序规则来进行排序的。在java中查找Collections类中的方法,会发现sort方法还有重载的方法,这个方法需要传入一个比较器作为参数,这时排序就是按照定义的比较器的排序规则来进行的了。就像在以下的演示代码中,定义的另一个List型的容器li一样,传入比较器StudentCoparator,它的怕排列顺序就是按照比比较器定义的排序来排列的。
接下来说一下,shufle方法。这个方法的作用是对List型的容器进行随机排序。简单来说就是洗牌原理,将一副扑克牌进行洗牌操作就是将其其中的牌打乱,进行随机分配。比如在演示代码中对容器li使用shufle方法,这个对它进行遍历,可以发现程序每运行一次它打印出来的顺序都不一定是相同的,也就是随机的。值得说明的一点是,这个方法仍然有重载的方法,重载方法中需要传入一个随机对象,这个对象可以是默认的,也可以是添加了seed的。
Random(seed)的使用方法如下:
- 创建实例:你可以使用给定的
seed
创建一个Random
对象,例如Random random = new Random(seed);
- 生成随机数:一旦有了
Random
对象,你可以调用其各种方法来生成不同范围的随机整数或浮点数,如nextInt()
,nextDouble()
等。 - 设置种子:如果不提供
seed
,则默认使用系统时间作为种子,如果程序需要保证每次运行生成的随机数序列一致,可以明确指定seed
值。
上面的这个描述可能比较抽象, 难点在于理解seed的作用。这里可以这样理解,如果我同时创建了两个Random对象,如果构造方法中的seed的值是一样的,那么这两个对象产生的随机数列也是一样的,这就是seed的作用。
package com.container.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class CollectionsTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("c");
list.add("b");
list.add("d");
list.add("a");
for (String str:list
) {
System.out.println(str);
}
System.out.println("_________________________");
//通过Collections类进行排序
Collections.sort(list);
for (String str:list
) {
System.out.println(str);
}
System.out.println("______________________________");
List<Student> li = new ArrayList<>();
Student s1 = new Student ("linyi",20);
Student s2 = new Student("linling",21);
Student s3 = new Student("liner",21);
li.add(s1);
li.add(s2);
li.add(s3);
for (Student stu:li
) {
System.out.println(stu);
}
System.out.println("________________________");
Collections.sort(li,new StudentComparator());
for (Student stu:li
) {
System.out.println(stu);
}
System.out.println("____________________________");
Collections.shuffle(li);
for (Student stu:li
) {
System.out.println(stu);
}
System.out.println("________________________");
Collections.shuffle(li,new Random());
for (Student stu:li
) {
System.out.println(stu);
}
}
}