Java compare()
和compareTo()
方法有什么区别?那些方法给出了相同的答案吗?
来自JavaNotes:
a.compareTo(b)
:
Comparable接口:比较值并返回一个int,它告诉值是否比较小于,等于或大于.
如果您的类对象具有自然顺序,请实现该Comparable
接口并定义此方法.所有具有自然排序实现的Java类Comparable
- 示例:String
,包装类,BigInteger
compare(a, b)
:
比较器接口: 比较两个对象的值.这被实现为的一部分Comparator
界面,并且典型的使用是定义实现此的一个或多个小工具类,传递给方法,例如sort()
或使用通过排序数据结构,例如TreeMap
和TreeSet
.您可能希望为以下内容创建Comparator对象:
多重比较.提供几种不同的方法来排序.例如,您可能希望按名称,ID,年龄,高度等对Person类进行排序.您可以为每个传递给sort()
方法的比较器定义一个Comparator .
系统类为无法控制的类提供比较方法.例如,您可以为字符串定义一个Comparator,它按长度比较它们.
策略模式要实现策略模式,您希望将算法表示为可以作为参数传递的对象,保存在数据结构中等.
如果您的类对象具有一个自然排序顺序,则可能不需要compare().
来自http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html的摘要
可比较
可比对象能够将自己与另一个对象进行比较.
比较
器比较器对象能够比较两个不同的对象.该类不是比较它的实例,而是比较其他类的实例.
用例上下文:
可比的界面
equals方法,并==
和!=
运营商平等/不平等的测试,但没有提供一个方法来测试相对值.
一些类(例如,String和具有自然排序的其他类)实现Comparable
接口,该接口定义compareTo()
方法.
您将要实现Comparable
在你的类,如果你想与使用Collections.sort()
或Arrays.sort()
方法.
定义Comparator对象
您可以创建比较器以对任何类的任意方式进行排序.
例如,String
该类定义了CASE_INSENSITIVE_ORDER
比较器.
这两种方法之间的区别可以与以下概念相关联:
有序集合:
订购Collection时,这意味着您可以按特定(非随机)顺序迭代集合(a Hashtable
未订购).
具有自然顺序的集合不仅仅是有序的,而是有序的.定义自然顺序可能很困难!(如自然字符串顺序).
HaveAGuess在评论中指出的另一个不同之处:
Comparable
是在实现中,并且从界面中看不到,所以当你排序时,你真的不知道会发生什么.
Comparator
让您放心,订购将得到很好的定义.
compareTo()
来自Comparable
界面.
compare()
来自Comparator
界面.
两种方法都做同样的事情,但每个接口都在稍微不同的上下文中使用.
在可比接口用于强加于实现类的对象自然排序.该compareTo()
方法称为自然比较方法.该比较器接口用于强加于实现类的对象进行整体排序.有关更多信息,请参阅确切何时使用每个接口的链接.
相似之处:
两者都是比较两个对象的自定义方式.
两者都返回int
描述两个对象之间的关系.
差异:
该方法compare()
是,你有责任,如果你执行来实现方法Comparator
的接口.它允许您将两个对象传递给方法,并返回int
描述它们之间关系的对象.
Comparator comp = new MyComparator(); int result = comp.compare(object1, object2);
该方法compareTo()
是,你有责任,如果你执行来实现方法Comparable
的接口.它允许将对象与相似类型的对象进行比较.
String s = "hi"; int result = s.compareTo("bye");
总结:
基本上它们是两种不同的比较方式.
这些方法不必给出相同的答案.这取决于您调用它们的对象/类.
如果您要在某个阶段实现自己想要比较的类,则可以让它们实现Comparable接口并相应地实现compareTo()方法.
如果您使用的API中的某些类没有实现Comparable接口,但您仍想比较它们.即排序.您可以创建自己的类来实现Comparator接口,并在其compare()方法中实现逻辑.