欢迎跳转到本文的原文链接:https://honeypps.com/java/comparable-and-comparator-analysis/
今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理。那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口?
Comparable和Comparator接口都是用来比较大小的,首先来看一下Comparable的定义:
package java.lang; import java.util.*; public interface Comparable
{ public int compareTo(T o); }
Comparator的定义如下:
package java.util; public interface Comparator
{ int compare(T o1, T o2); boolean equals(Object obj); }
package collections; public class Person1 implements Comparable
{ private int age; private String name; public Person1(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person1 o) { return this.age-o.age; } @Override public String toString() { return name+":"+age; } }
Person1 person1 = new Person1("zzh",18); Person1 person2 = new Person1("jj",17); Person1 person3 = new Person1("",19); List
list = new ArrayList<>(); list.add(person1); list.add(person2); list.add(person3); System.out.println(list); Collections.sort(list); System.out.println(list);
输出结果:
[zzh:18, jj:17, :19] [jj:17, zzh:18, :19]
如果我们的这个类无法修改,譬如String,我们又要对其进行排序,当然String中已经实现了Comparable接口,如果单纯的用String举例就不太形象。对类自身无法修改这就用到了Comparator这个接口(策略模式)。
public final class Person2 { private int age; private String name; public Person2(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name+":"+age; } //getter and setter方法省略.... }
如类Person2,这个类已经固定,无法进行对其类自身的修改,也修饰词final了,你也别想继承再implements Comparable,那么此时怎么办呢?在类的外部使用Comparator的接口。如下测试代码:
Person2 p1 = new Person2("zzh",18); Person2 p2 = new Person2("jj",17); Person2 p3 = new Person2("",19); List
list2 = new ArrayList
(); list2.add(p1); list2.add(p2); list2.add(p3); System.out.println(list2); Collections.sort(list2,new Comparator
(){ @Override public int compare(Person2 o1, Person2 o2) { if(o1 == null || o2 == null) return 0; return o1.getAge()-o2.getAge(); } }); System.out.println(list2);
输出结果:
[zzh:18, jj:17, :19] [jj:17, zzh:18, :19]
这里(public static
void sort(List
list, Comparator
c) )采用了内部类的实现方式,实现compare方法,对类Person2的list进行排序。
再譬如博主遇到的真实案例中,需要对String进行排序,且不区分大小写,我们知道String中的排序是字典排序,譬如:A a D排序之后为A D a,这样显然不对,那么该怎么办呢?同上(下面代码中的list是一个String的List集合):
Collections.sort(list, new Comparator
() { @Override public int compare(String o1, String o2) { if(o1 == null || o2 == null) return 0; return o1.toUpperCase().compareTo(o2.toUpperCase()); } });
这样就可以实现不区分大小进行排序String的集合了,是不是很方便~
public class WordList{ public static void main(String args[]){ Set
s = new TreeSet
(); Collections.addAll(s,args); System.out.println(s); } }
欢迎跳转到本文的原文链接:https://honeypps.com/java/comparable-and-comparator-analysis/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211123.html原文链接:https://javaforall.net
