Java comparable和Comparator接口的区别

初次学习java接口和集合框架,对里面的比较和排序,总是一知半解。今天查阅资料,加深了理解,总结如下。

1. Comparable接口可以说成是“自然比较器”,是标准类库中自带的比较器,很多类都实现了该接口,比如Integer、String等。该接口只提供一个方法:compareTo


实现了该接口的类,可以使用Arrays.sort()方法。

2. Comparator接口是外部比较器,该接口有很多方法。使用场景:当我们需要的比较规则,Comparable接口无法满足时,可以使用这个接口来实现自定义比较规则。

Arrays.sort()和TreeSet等类中就可以使用新定义的接口规则。

举例说明:

a. Integer实现了Comparable接口,但是比较规则是按实际值比较,如果需要按照别的规则对数值进行比较,例如,通过绝对值进行比较大小,则需要自定义比较器Comparator。

该段例子,引用自:http://blog.csdn.net/mageshuai/article/details/3849143

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

/**
 * comparator是外部比较器,comparable是内部比较器。
 * 本例中,当integer的comparable接口的排序规则不是我们所需要的时候,通过实现comparator接口,完成用绝对值排序的算法。
 * @author 
 *
 */

public class ComparatorVsComparableDemo implements Comparator{
	public int compare(Integer int1, Integer int2) {
		int v1 = Math.abs(int1.intValue());
		int v2 = Math.abs(int2.intValue());
		return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
	}
	public static void main(String[] args) {
		 //产生一个20个随机整数的数组(有正有负)     
	      Random   rnd   =   new   Random();     
	      Integer[]   integers   =   new   Integer[20];     
	      for(int   i   =   0;   i   <   integers.length;   i++)     
	      integers[i]   =   new   Integer(rnd.nextInt(10)   *   (rnd.nextBoolean()   ?   1   :   -1));     
	    
	      System.out.println("用Integer内置方法排序:");     
	      Arrays.sort(integers);     
	      System.out.println(Arrays.asList(integers));     
	    
	      System.out.println("用AbsComparator排序:");     
	      Arrays.sort(integers,   new   ComparatorVsComparableDemo());     
	      System.out.println(Arrays.asList(integers));     		
	}
}

你可能感兴趣的:(java,比较器,JAVA技术)