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 不会影响原始类。

Difference between Comparable and Comparator
Comparable 和 Comparator 的区别

在这里,我分析了 comparable 和 Comparator 之间的区别,并将全面评估它们的优缺点。

Java 中的 Comparable 是什么?

Java 中的Comparable 是一个对象,它将自身与其他对象进行比较。它有助于对自定义对象的列表进行排序。Java.lang.Comparable 接口应该由一个类来实现,以便比较它的实例。实现 Comparable 接口的对象的数组会自动由 Arrays.sortCollections.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 之间的混淆,这是主要区别

Difference between Comparable and Comparator in Java
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 可以极大地增强我们对数据排序的控制,从而提高性能和功能。