Java中Comparable和Comparator使用区别

Comparable和Comparator接口都是用来比较大小的,首先来看一下Comparable的定义:

package java.lang;
import java.util.*;
public interface Comparable<T> {
    public int compareTo(T o);
}
package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}
  • Comparable对实现他的每个类的对象进行整体排序。若一个类实现了comparable接口,实现Comparable接口的类的对象的List列表可以通过Collections.sort()进行排序。实现comparable必须修改自身的类。
  • 如果一个类无法修改,例如String。String中已经实现了Comparable接口。这是对类无法修改就用到了Comparator这个接口。
  • 为什么comparator继承的时候只实现了一个方法。

实际上,当一个类没有显示继承父类的时候,会有一个默认的父类。就是object。在object类中有一个equals的方法。所以不强制要求comparator实现equals方法,直接调用父类的即可。虽然你显示地实现了equals()方法更好。
Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。

  • 前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。
  • 我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。
    例子
package com.wyd.cn;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class collection_com {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
    List<Integer> list   = new LinkedList<Integer>();
    List<Integer> list2  = new ArrayList<Integer>();
    String a;
    int array[]= {1,7,2,3};
    for(int i=0;i<array.length;i++)
    {
        list.add(new Integer(array[i]));
        list2.add(new Integer(array[i]));
	}
    Collections.sort(list, new Comparator<Integer>() {

		@Override
		public int compare(Integer o1, Integer o2) {
			// TODO Auto-generated method stub
			return o2-o1;
		}
    	
    });
    Collections.sort(list2);
    for(int i=0;i<array.length;i++)
    {
        System.out.println(list.get(i));
        System.out.println(list2.get(i));
	}

 }
}
class person implements Comparator<person>
{

	@Override
	public int compare(person o1, person o2) {
		// TODO Auto-generated method stub
		return 0;
	}
	


}

猜你喜欢

转载自blog.csdn.net/qq_22152499/article/details/89069457