Java 中的 Comparable 与 Comparator
Java 中 Comparable 和 Comparator 的关键区别
- Java 中的 Comparable 是一个对象,用于将其自身与另一个对象进行比较,而 Comparator 是一个用于比较不同类别的不同对象的对象。
- Comparable 在 Java 中提供
compareTo()
方法来对元素进行排序,而 Comparator 在 Java 中提供compare()
方法来对元素进行排序。 - Comparable 接口存在于
java.lang
包中,而 Comparator 接口存在于java.util
包中。 - Comparable 提供单一排序序列,而 Comparator 提供多个排序序列。
- Comparable 会影响原始类,而 Comparator 不会影响原始类。

在这里,我分析了 comparable 和 Comparator 之间的区别,并将全面评估它们的优缺点。
Java 中的 Comparable 是什么?
Java 中的Comparable 是一个对象,它将自身与其他对象进行比较。它有助于对自定义对象的列表进行排序。Java.lang.Comparable 接口应该由一个类来实现,以便比较它的实例。实现 Comparable 接口的对象的数组会自动由 Arrays.sort
和 Collections.sort
方法排序。
Comparable 中使用的方法
我想强调一个我在 Comparable 接口中经常使用的重要方法
CompareTo()
CompareTo() 方法用于对字符串执行自然排序。自然排序是指适用于该对象的排序顺序,例如,对整数进行排序的数字顺序,对字符串进行排序的字母顺序等。
CompareTo()
方法的语法如下:
int compareTo(T obj)
在上面的语法中,T 表示您将要比较的对象的类型。
CompareTo()
方法将对象与 T obj 进行比较。
输出
- 如果值相等,则返回 0。
- 如果对象的值较低,则此方法返回负值。
- 如果对象的值较高,则返回正值。
Java 中 Comparable 的示例
以下 Java comparable 示例程序显示了两个字符“a”和“b”的比较。字符“a”在字母顺序上排在“b”之前。
因此,输出是 -1。字符“b”在字母顺序上排在“a”之后。因此,输出是 1。字符“a”和“b”都等效。因此,输出是 0。
public class Sample_String { public static void main(String[] args) { String str_Sample = "a"; System.out.println("Compare To 'a' b is : " + str_Sample.compareTo("b")); str_Sample = "b"; System.out.println("Compare To 'b' a is : " + str_Sample.compareTo("a")); str_Sample = "b"; System.out.println("Compare To 'b' b is : " + str_Sample.compareTo("b")); } }
输出
Compare To 'a' b is : -1 Compare To 'b' a is : 1 Compare To 'b' b is : 0
Java 中的 Comparator 是什么?
Java 中的 Comparator 是一个对象,用于比较不同对象的不同对象。Java 中的 Comparator 接口也用于排列用户自定义类的对象。它包含两个重要的 Comparator 接口方法,称为 compare (Object obj1, Object obj2) 和 equals (Object element)。
Comparator 中使用的方法
在我的实践中,我经常依赖 Comparator 接口的以下关键方法
Compare()
Compare()
使您能够对对象进行排序。为此,您需要创建一个实现 Comparator 接口的类。之后,您需要覆盖其 compare 方法。
compare()
方法的语法如下:
compare(Object obj1, Object obj2)
在上面的语法中,obj1 和 obj2 是您需要使用 compare() 方法比较的两个对象。compare()
方法。
输出
- 如果第一个参数小于第二个参数,则返回一个负整数。
- 如果第一个参数和第二个参数相等,则返回零。
- 如果第一个参数大于第二个参数,则此方法可以返回一个正整数。
您必须确保关系是可传递的。例如,((compare(a, b)>0) && (compare(b, c)>0)) 意味着 compare(a, c)>0。
Java 中 Comparable 的示例
在下面的 Java comparator 示例中,有 6 个 变量。“x”、“y”、“p”、“q”、“r”和“s”。输出是 -1,因为“x”的值 20 小于“y”的值 30。输出是 0,因为“p”的值 40 等于“q”的值 40。
import java.lang.Integer; public class example { public static void main(String args[]) { int x = 20; int y = 30; // as 10 less than 20, // Output will be a value less than zero System.out.println(Integer.compare(x, y)); int p = 40; int q = 40; // as 30 equals 30, // Output will be zero System.out.println(Integer.compare(p, q)); int r = 20; int s = 7; // as 15 is greater than 8, // Output will be a value greater than zero System.out.println(Integer.compare(r, s)); } }
输出
-1 0 1
Equals()
Equals()
验证数字对象是否等于作为参数传递的对象。
equals()
方法的语法如下:
public boolean equals(Object o)
此方法接受两个参数:1) 任何对象,2) 返回值。如果传递的参数不为空,并且是具有相同数值的相似类型的对象,则返回 true。
Equals 方法示例
在下面的示例中,我将比较四个变量。三个变量是整数类型,一个变量是 short 类型。第一个结果为 false,因为 p 的值 5 不等于 q 的值 20。
第二个结果为 true,因为变量 p 和 r 的值相同,都是 5。最后,输出为 false,因为变量 p 和 s 的赋值不同。
public class Test { public static void main(String args[]) { Integer p = 5; Integer q = 20; Integer r =5; Short s = 5; System.out.println(p.equals(q)); System.out.println(p.equals(r)); System.out.println(p.equals(s)); } }
输出
false true false
Java 中 Comparable 和 Comparator 的区别
我经常看到 Java Comparable 和 Comparator 之间的混淆,这是主要区别
比较依据 | Comparable | Comparator |
---|---|---|
方法 | Comparable 在 Java 中提供 compareTo() 方法来对元素进行排序。 |
Comparator 在 Java 中提供 compare() 方法来对元素进行排序。 |
包 | Comparable 接口存在于 java.lang 包中。 |
Comparator 接口存在于 java.util 包中。 |
排序逻辑 | 排序逻辑必须与您要排序的对象位于同一类中。 | 排序逻辑应放在单独的类中,以便根据对象的不同属性编写不同的排序。 |
类对象 | 您想要排序其对象的类必须实现 Comparable 接口。 | 您想要排序其对象的类不需要实现 Comparator 接口。 |
排序序列 | 它提供单一排序序列。 | 它提供多个排序序列。 |
排序顺序 | 此方法可以根据自然排序顺序对数据进行排序。 | 此方法根据自定义排序顺序对数据进行排序。 |
类 | 它会影响原始类。即,实际类被修改。 | 它不会影响原始类,即实际类未被修改。 |
用途 | 在 API 中经常通过 Calendar、Wrapper 类、Date 和 String 来实现。 |
它被实现用于对第三方类的实例进行排序。 |
实现 | 所有包装类和字符串类都实现 Comparable 接口。 | Comparator 的唯一实现类是 Collator 和 RuleBasedColator。 |
在 Java 中使用 Comparator 和 Comparable 的最佳实践
- 当比较对于特定类是标准时,使用 Comparable 接口。
- 您可以使用 lambda 表达式与 Comparator 一起使用。
- 许多可用的核心类都实现了 Comparable 接口。
- 在对 Set 或 Map 进行排序时,可以使用 TreeSet 和 TreeMap。
compareTo()
方法同时适用于 Comparator 和 Comparable。- 仅当您<需要更多灵活性时,才使用 Comparator 接口。
- 如果第一个对象大于另一个对象,
compareTo()
方法将返回正整数;如果小于,则返回负整数;如果两者相同,则返回零。
如何选择 Comparable 和 Comparator
总之,我的实践经验表明,在 Java 中利用 Comparable 和 Comparator 可以极大地增强我们对数据排序的控制,从而提高性能和功能。