Java高级—Collections类
Collections类和Collection接口是完全两个不同的东西,大家一定要清楚。
Collections类和之前讲的Arrays类一样,都是工具类。一个对集合操作,一个对数组。
一、Collections类中常用的方法:
1.swap(List list, int i, int j) :将指定列表中的两个索引进行位置互换
2.sort(List list) :按照列表中元素的自然顺序进行排序
3.shuffle(List list):随机置换
4.reverse(List list) :反转
5.fill(List list, Object obj) :使用指定的对象填充指定列表的所有元素
6.copy(List dest, List src) :是把源列表中的数据覆盖到目标列表
7.binarySearch(List list, Object key) 使用二分查找法查找指定元素在指定列表的索引位置
8.max()\min():查找最大\最小值
这里我们看一下Collections的sort的源码
【注意:Collections类中的sort其实就是Arrays类中的sort】
点开Collections.sort就会看到
再点进去,注意看:先转成object数组,然后利用Arrays.sort进行排序,是不是突然发现了什么
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、两种比较方式
当我们要进行自定义比较的时候,就会使用下面的两种方式。
1、使用Comparator进行比较(不推荐)
重写 compare方法
具体实现:
ArrayList<Integer> list = new ArrayList();
list.add(49);
list.add(29);
list.add(88);
list.add(-49);
list.add(56);
System.out.println(list);
Collections.sort(list); //默认升序
System.out.println(list);
Collections.sort(list, new Comparator<Integer>() { //这里就是匿名内部类,重写了compare方法
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1; //降序:o2-o1,升序:o1-o2
}
});
System.out.println(list);
为什么不推荐,原因就是每次比较都要重写compare方法,麻烦
2、使用Comparable进行比较(推荐)
重写compareTo方法
要求:根据学生的成绩进行比较排序
具体实现:
Student类:
public class Student implements Comparable<Student>{
private String name;
private String gender;
private int score;
public Student(String name, String gender) {
this.name = name;
this.gender = gender;
}
public Student(String name, String gender, int score) {
this.name = name;
this.gender = gender;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "姓名:" + name + "\t" +
"性别:" + gender + "\t"+
"成绩:" + score ;
}
@Override
public int compareTo(Student o) { //重写compareTo方法
return this.score-o.score; //成绩升序
}
}
测试类:
Student s1 = new Student("Jack","男",98);
Student s2 = new Student("Alis","女",87);
Student s3 = new Student("Louis","女",59);
Student s4 = new Student("Tom","男",88);
List<Student> list = new LinkedList();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
Collections.sort(list);
System.out.println(list);
结果显示
这样就比较方便,一次写好,全类共享。