zoukankan      html  css  js  c++  java
  • Comparable和Comparator的区别

    Comparable

    Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

    Comparable接口是内比较器,也就是自己参与比较,需要实现compareTo方法。Comparable的compareTo方法需要传入一个对象,然后自己和该对象比较。

    有三种情况

    1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

    2、比较者等于被比较者,那么返回0

    3、比较者小于被比较者,那么返回负整数

    package algorithm;
    
    public class Person implements Comparable<Person> {    //Comparable后面的泛型不一定和当前类一样,可以是别的类,只要能把compareTo的算法写好就行,并不要求相同class比较。但是如果想要使用Collections.sort或Arrays.sort进行自动排序就必须是相同的class。
    
    	private String name;
    
    	public Person() {
    
    	}
    
    	public Person(String name) {
    		this.name = name;
    	}
    
    	public int compareTo(Person person) {
    		if (this.name.compareTo(person.name) > 0)
    			return 1;
    		else if (this.name.compareTo(person.name) == 0)
    			return 0;
    		else
    			return -1;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    }
     
    public static void main(String[] args) throws Exception {
    	Person d1 = new Person("c");
    	Person d2 = new Person("c");
    	Person d3 = new Person("b");
    	Person d4 = new Person("d");
    	System.out.println(d1.compareTo(d2));
    	System.out.println(d1.compareTo(d3));
    	System.out.println(d1.compareTo(d4));
    }
    

     结果

    0
    1
    -1
    

    Comparator 

    Comparetor是外比较器,相当于它本身不作为比较的对象,它提供的是一个比较平台。

    package algorithm;
    
    public class Person {
    
    	private String name;
    
    	public Person() {
    	}
    
    	public Person(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    }
    
    public static void main(String[] args) throws Exception {
    		Person d1 = new Person("c");
    		Person d2 = new Person("a");
    		Person d3 = new Person("b");
    		List<Person> persons = new ArrayList<>();
    		persons.add(d1);
    		persons.add(d2);
    		persons.add(d3);
    		List<Person> orderPersons = sort(persons);;
    		for(Person person:orderPersons){
    			System.out.println(person.getName());
    		}
    	}
    	
    	 public static List<Person> sort(List<Person> persons){
    	      Collections.sort(persons, new Comparator<Person>(){
    	           public int compare(Person o1, Person o2) {
    	        	   if (o1.getName().compareTo(o2.getName()) > 0)
    	       			return 1;
    	       		else if (o1.getName().compareTo(o2.getName()) == 0)
    	       			return 0;
    	       		else
    	       			return -1;
    	           }
    
    	      });
    	  return persons;
    	 }
    

     结果是

    a
    b
    c
    

    这个是Comparator的匿名类的用法,当然也可以实现一个接口,哪个类实现了该接口就是作为一个比较器。

    Comparator的用法耦合度会低一些。

  • 相关阅读:
    Linux下架构高可用性网络----HA+LB+lvs
    MacBook如何用Parallels Desktop安装windows7/8
    Win10如何彻底禁用小娜?彻底禁用小娜的方法
    安卓手机微信发不出去怎么办 微信不能发信息怎么办
    计算机名、主机名、用户账户名与NetBIOS名有什么区别
    安装corel x8提示你已安装了另外一个版本
    ssh整合问题总结--在添加商品模块实现图片(文件)的上传
    代理设计模式之静态代理与动态代理(超..)详解
    Java基础--反射机制的知识点梳理
    ssh整合问题总结--运行项目时报java.lang.StackOverflowError(堆栈溢出)异常
  • 原文地址:https://www.cnblogs.com/tp123/p/6401994.html
Copyright © 2011-2022 走看看