Java compare()和compareTo()之间有什么区别?

Java compare()和compareTo()之间有什么区别?,java,Java,Java的compare()和compareTo()方法之间有什么区别?这些方法给出了相同的答案吗?compareTo()来自接口 compare()来自接口 这两种方法都做相同的事情,但每个接口在稍微不同的上下文中使用 接口用于对实现类的对象施加自然顺序。compareTo()方法称为自然比较方法。接口用于对实现类的对象施加总顺序。有关详细信息,请参阅链接以了解何时使用每个接口。compareTo()在一个对象上调用,以将其与另一个对象进行比较。 对某个对象调用compare(),以比较其他两

Java的
compare()
compareTo()
方法之间有什么区别?这些方法给出了相同的答案吗?

compareTo()
来自接口

compare()
来自接口

这两种方法都做相同的事情,但每个接口在稍微不同的上下文中使用

接口用于对实现类的对象施加自然顺序。
compareTo()
方法称为自然比较方法。接口用于对实现类的对象施加总顺序。有关详细信息,请参阅链接以了解何时使用每个接口。

compareTo()
在一个对象上调用,以将其与另一个对象进行比较。 对某个对象调用
compare()
,以比较其他两个对象

区别在于定义了进行实际比较的逻辑。

来自:

  • 与(b)相比:
    可比较接口:比较值并返回一个int,该int告诉您值的比较是小于、等于还是大于。
    如果类对象具有自然顺序,请实现
    可比
    接口并定义此方法。所有具有自然排序的Java类都实现了
    compariable
    -示例:
    String
    biginger

  • 比较(a,b)

    比较器接口:比较两个对象的值。这是作为
    比较器
    接口的一部分实现的,典型用途是定义一个或多个实现此功能的小型实用程序类,将其传递给
    sort()
    等方法,或通过对
    树映射
    树集
    等数据结构排序使用。您可能希望为以下对象创建比较器对象:

    • 多重比较。提供几种不同的排序方法。例如,您可能希望按姓名、ID、年龄、身高等对Person类进行排序。。。您可以为每个方法定义一个比较器,以传递给
      sort()
      方法
    • 系统类为您无法控制的类提供比较方法。例如,您可以为按长度进行比较的字符串定义一个比较器
    • Strategy pattern实现一个Strategy pattern,在这种情况下,您希望将算法表示为一个对象,可以作为参数传递,保存在数据结构中,等等
如果类对象有一个自然排序顺序,则可能不需要compare()


总结自


可比
一个可比较的对象能够将自己与另一个对象进行比较

比较器
比较器对象能够比较两个不同的对象。该类不是比较其实例,而是比较其他一些类的实例


用例上下文:

可比界面

public interface Comparator<Employee> {
 int compare(Employee obj1, Employee obj2);
}
equals方法和
==
=运算符测试相等/不相等,但不提供测试相对值的方法
一些类(例如字符串和其他具有自然顺序的类)实现了
Comparable
接口,该接口定义了
compareTo()
方法。
如果要将类与
集合.sort()
数组.sort()方法一起使用,则需要在类中实现
Comparable

定义比较器对象

您可以创建比较器,对任何类进行任意排序
例如,
String
类定义了


这两种方法之间的差异可能与以下概念有关:
有序收集

对集合进行排序时,这意味着您可以按特定(非随机)顺序在集合中进行迭代(哈希表
未排序)

具有自然顺序的集合不仅是有序的,而且是排序的。定义自然秩序(如中)


in指出的另一个区别是:

  • Comparable
    在实现中,从界面上看不到,因此在进行排序时,您不知道会发生什么
  • Comparator
    让您放心,订购将得到很好的定义
具有此方法的对象与其合作者的关系不同

compareTo()
是接口的一种方法,因此它用于将此实例与另一个实例进行比较

compare()
是接口的一种方法,因此它用于比较另一个类的两个不同实例

如果愿意,实现
Comparable
意味着可以轻松比较类的实例。

实现
Comparator
意味着实例适合于比较(其他类的)不同对象。

当您想要对包含对象Foo的列表进行排序时,Foo类必须实现可比较接口,因为列表的排序方法使用此方法


当您想要编写一个比较其他两个类的Util类时,您可以实现Comparator类。

这些方法不必给出相同的答案。这取决于您调用它们的对象/类

如果您正在实现您自己的类,并且知道您希望在某个阶段对这些类进行比较,那么可以让它们实现Comparable接口并相应地实现compareTo()方法

如果您使用的API中的某些类没有实现类似的接口,但是
String s = "hi";
int result = s.compareTo("bye");
Important Answar
String name;
int roll;

public int compare(Object obj1,Object obj2) { // For Comparator interface
    return obj1.compareTo(obj1);
}

public int compareTo(Object obj1) { // For Comparable Interface
    return obj1.compareTo(obj);
}
name.compareTo(obj1.getName()) // Correct Statement.
roll.compareTo(obj1.getRoll()) 
// Wrong Statement Compile Time Error Because roll 
// is not an Object Type, it is primitive type.
public int compareTo(Object obj1) { // For Comparable Interface
    Student s = (Student) obj1;
    return rollno - s.getRollno();
}  
public int compare(Object obj1,Object obj2) { // For Comparator interface
    Student s1 = (Student) obj1;
    Student s2 = (Student) obj2;
    return s1.getRollno() - s2.getRollno();
}  
compareTo(T object)
compare(T obj1, T obj2)
public class Car  {

    int modelNo;

    int modelYear;

    public int getModelNo() {
        return modelNo;
    }

    public void setModelNo(int modelNo) {
        this.modelNo = modelNo;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

}
public class CarModelNoCompartor implements Comparator<Car>{

    public int compare(Car o1, Car o2) {

        return o1.getModelNo() - o2.getModelNo();
    }

}
public class CarModelYearComparator implements Comparator<Car> {

    public int compare(Car o1, Car o2) {

        return o1.getModelYear() - o2.getModelYear();
    }

}
emp1.getName().compareTo(emp2.getName())
public interface Comparator<Employee> {
 int compare(Employee obj1, Employee obj2);
}
public class NameComparator implements Comparator<Employee> {

public int compare(Employee e1, Employee e2) {
     // some conditions here
        return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an 
    return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
class Pokemon {
    int healthPoints;
    int attackDamage;
    public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
        if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
            System.out.println("battle won");
        } else {
            System.out.println("battle lost");
        }
    }
}