Comparable与Comparator浅析

Comparable与Comparator浅析今天博主在翻阅 TreeMap 的源码 发现其键必须是实现 Comparable 或者 Comparator 的接口时产生了一些兴趣 比如在 TreeMap 中的 put 方法分别对 Comparable 和 Comparator 接口分别进行处理 那么疑问就来了 Comparable 和 Comparator 接口的区别是什么 Java 中为什么会存在两个类似的接口 Comparable 和 Comparator 接口都是用



欢迎跳转到本文的原文链接: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

(0)
上一篇 2026年3月18日 下午11:09
下一篇 2026年3月18日 下午11:10


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号