简述Comparable和Comparator两个接口的区别
Comparable:强行对实现它的每个类的对象进行整体排序。
这种顺序被称为类的自然顺序
类的compareTo方法被称为自然的比较方法,只能在类中实现compareTo()
一次,不能经常修改类的代码实现自己想要的顺序。
实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序
对象可以用作有序映射中的键或者有序集合中的元素,不用指定比较器。
Comparator:强行对某个对象进行整体排序。
可以将Comparator传递给sort方法(Collections.sort或Arrays.sort)
从而允许在排序顺序上实现精准控制
还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,
或者为那些没有自然顺序的对象collection提供排序。
Comparable接口和Comparator接口的区别
- Comparable接口位于java.lang包下;Comparator位于java.util包下
- Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
- 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。
- 这上面摘大佬理解https://blog.csdn.net/IT_10/article/details/104747173
- Comparable是适合给类使用的 类之间 对象的比较
public int compareTo(User o){
if(this.age>o.getAge()){
return1;
}elseif(this.age<o.getAge()){
return-1;*//**这里的值会影响排序是降序还是升序*
}else{
return0;
}
}
*Comparablecomparable=(o1)->{*
*//returnthis.age-o1.age;*
*//};//**这个只适合类比*
*//**如果****为**intStirng**这种就无法实现*
- Comparator 比较器可以被类实现也可以在外部实现 也是实现2个类直接的比较 需要重写的方法 是2个参数 2个 对象(参数)进行比较
public int compare(Child o1,Child o2){
returno1.getAge()>o2.getAge()?1:(o1.getAge()==o2.getAge()?0:-1);
}
更适合在外部实现 ,也可以是2个值进行比较
Arrays.*sort*(users,(o1,o2)->{
returno1.getAge()-o2.getAge();
});
*//**也可以通过**2**参数进行**lambda**实现**comparatore**接口
集合数据结构
作为SortedMap的Key必须实现Comparable接口,或者传入Comparator;
当 使用 内部为有序 或者排序接口的Map或者set 集合存储数据时,必须实现Comparable接口!!或者外部实现
Comparator比较器!!! 注!! 实现方法时 返回值必须 为 3种情况 -1,1,0
大于和小于 以及相等的情况!!!
Exception in thread “main” java.lang.ClassCastException: class aCsCsCsCs.Comparable.SortAndSet cannot be cast to class java.lang.Comparable (aCsCsCsCs.Comparable.SortAndSet is in unnamed module of loader ‘app’;
报classCastException异常!
所以在使用有序set或者有序Map存储元素时存储的对象必须实现Comparable接口
否则必须外部实现 Comparator**接口 如:
TreeSet<SortAndSet> sets =new TreeSet<>(newComparator<SortAndSet>(){
@Override
publicintcompare(SortAndSeto1,SortAndSeto2){
returno1.age-o2.age;
}
});
即 在创建集合时传入一个newComparator比较器!