java数据结构-Comparable&Comparator
2013-11-30 18:18
393 查看
在深入了解TreeMap之前,有两个接口要先弄清楚,分别是Comparable和Comparator
Comparable & Comparator
Comparable
Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)。
它只有一个方法,int compareTo(T o),用来比较当前对象和传入的参数,查看jdk api,共有这一批类实现了此接口,见下图
打开实现了该接口的Integer包装类查看源码
可以看到该方法通过当前的Integer对象的值是否大于传入的参数来得到返回值,Integer的compareTo实现是按数字大小的自然排序,再找另一个例子String
可以看出String的compareTo实现是按字符串中字符的Unicode值进行排序的,也真是因为各种类实现的不同,所以只有在相互可比的类才能进行排序,否则会抛出java.lang.ClassCastException的异常。应该说Comparable是集合内部实现的排序,想要进行集合外的排序就需要Comparator接口。
Comparator
如果一个类不能实现Comparable接口,那么我们自己可以提供Comparator的排序,如果你不喜欢缺省的Comparator行为,照样可以编写自己的Comparator。
Comparator只有2个方法,分别为int compare(T o1, T o2) 和boolean equals(Object obj)
Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一个元素出现在第二个元素之前,则返回一个负值,如果第一个元素出现在第二个元素后面,返回一个正值,再否则,返回零。与Comparable不同的是Comparator是由用户自行决定处理。
通过一个小例子可以比较明确的看出
Comparator比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
在深入了解TreeMap之前,有两个接口要先弄清楚,分别是Comparable和Comparator
Comparable & Comparator
Comparable
Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)。
它只有一个方法,int compareTo(T o),用来比较当前对象和传入的参数,查看jdk api,共有这一批类实现了此接口,见下图
打开实现了该接口的Integer包装类查看源码
public final class Integer extends Number implements Comparable<Integer> { public int compareTo(Integer anotherInteger) { int thisVal = this.value; int anotherVal = anotherInteger.value; return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); }
可以看到该方法通过当前的Integer对象的值是否大于传入的参数来得到返回值,Integer的compareTo实现是按数字大小的自然排序,再找另一个例子String
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) { int k = i; int lim = n + i; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } } else { while (n-- != 0) { char c1 = v1[i++]; char c2 = v2[j++]; if (c1 != c2) { return c1 - c2; } } } return len1 - len2; }
可以看出String的compareTo实现是按字符串中字符的Unicode值进行排序的,也真是因为各种类实现的不同,所以只有在相互可比的类才能进行排序,否则会抛出java.lang.ClassCastException的异常。应该说Comparable是集合内部实现的排序,想要进行集合外的排序就需要Comparator接口。
Comparator
如果一个类不能实现Comparable接口,那么我们自己可以提供Comparator的排序,如果你不喜欢缺省的Comparator行为,照样可以编写自己的Comparator。
Comparator只有2个方法,分别为int compare(T o1, T o2) 和boolean equals(Object obj)
Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一个元素出现在第二个元素之前,则返回一个负值,如果第一个元素出现在第二个元素后面,返回一个正值,再否则,返回零。与Comparable不同的是Comparator是由用户自行决定处理。
通过一个小例子可以比较明确的看出
class ComparatorTest implements Comparator{ public int compare(Object u1, Object u2) { String uname1 = ((User)u1).getName(); String uname2 = ((User)u2).getName(); return uname1.compareTo(uname2); } } class User { private String name; public String getName(){ return this.name; } }
Comparator比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
相关文章推荐
- Java学习笔记--Comparable & Comparator
- JAVA--Comparable&&Comparator&&compare&&compareTo
- Java:对象排序:Comparator&Comparable
- Java提高十五:容器元素比较Comparable&Comparator深入分析
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第7节 Comparable&Comparator简介
- 16.Java 基础 - Comparable & Comparator
- java对象比较规则:Comparable & Comparator
- Java 中Comparable和Comparator区别比较
- Comparator and Comparable in Java
- Java--comparator接口与Comparable接口的区别
- core java之Comparable 与Comparator接口比较
- java学习(十六):对象的自定义比较,Comparator和Comparable
- Java中Comparable和Comparator实现对象比较
- Java 中 Comparable 和 Comparator 比较
- Java排序: Comparator vs Comparable 入门
- Java之美[从菜鸟到高手演练]之Comparator和Comparable在排序中的应用
- java学习笔记13--比较器(Comparable、Comparator)
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- Java 解惑:Comparable 和 Comparator 的区别
- java基础---->Comparable和Comparator的使用