equals、compareTo、hashCode()的区别

一、equals与compareTo
equals只返回   true   or   false。
compareTo   返回的是   int   型,   根据字母顺序进行比较。

compareTo是值比较
equals是对象比较
如:
Integer   i1   =   new   Integer(10);
Integer   i2   =   new   Integer(10);
compareTo相等,equals不等。

 

二、equals、compareTo、hashCode

  判断两个对象是否相等(是同一个对象),首先调用hashCode()方法得到各自的hashcode,

1、如果hashcode不相等,则表明两个对象不相等。

2、如果hashcode相等,继续调用equals方法进行判断

  2.1:equals()返回true,则对象相等

  2.2:equals()返回fasle,两对象不相等

所以,要求程序员在重写hashCode方法时尽量做到:不一样的对象,hashCode不一样,这样在判断两个对象是否是同一对象时可以提高效率。

根据这两点,我们可以看一道常见的JAVA面试题:

题目:对于两个对象A、B,A.equals(B)==true,不一定有相同的hashCode(); 这句话是错误的。

当然你自己定义的对象可以实现equals相同而hashCode不同(并不会报错,不知道JAVA为什么不限死),但java的Object类中规定相同的对象一定要有相同的hashCode:原话如下:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

 

compareTo()方法和equals()方法的关系:

对于某些对象如集合(TreeSet)需要实现内部排序,所以要实现Comparable接口,从而要实现里面的唯一方法compareTo();实现Comparable接口的对象表明遵循自然排序。从Comparable的API中可以看出:

 重写compareTo()方法,不要求必须重写equals()方法,但是却强烈推荐重写equals(),以使两个方法的比较结果在逻辑上是一致。原话如下:

It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals method.

    所以在编写需要用TreeSet添加的对象时,该对象一定要实现Comparable接口,并且重写compareTo()方法,并推荐同时重写equals()方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要重写equalshashCode方法,需要在类中重写这两个方法。以下是一个示例代码,其中假设有一个名为Person的类,其中包含age和name属性。 ``` import java.util.Objects; public class Person { private int age; private String name; // 构造函数等其他成员变量和方法省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(age, name); } // 比较年龄升序,年龄相同时比较英文姓名升序 public int compareTo(Person otherPerson) { int result = Integer.compare(this.age, otherPerson.age); if (result == 0) { result = this.name.compareTo(otherPerson.name); } return result; } // toString方法 @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } } ``` 在equals方法中,我们比较了两个Person对象的age和name属性是否相等。在hashCode方法中,我们使用Objects类的hash方法来生成hashCode。对于比较年龄和英文姓名,我们在类中添加了一个compareTo方法,其中比较了两个Person对象的age和name属性,如果当前对象的age小于otherPerson对象的age,则返回-1,如果当前对象的age大于otherPerson对象的age,则返回1,如果当前对象的age等于otherPerson对象的age,则比较name属性。最后,我们在类中添加了toString方法,用于将Person对象转换为字符串输出。 示例代码中,可以通过以下方式将Person对象按照年龄升序,年龄相同时按照英文姓名升序排列: ``` List<Person> personList = new ArrayList<>(); personList.add(new Person(25, "Tom")); personList.add(new Person(18, "Bob")); personList.add(new Person(18, "Adam")); Collections.sort(personList); System.out.println(personList); ``` 输出: ``` [Person{age=18, name='Adam'}, Person{age=18, name='Bob'}, Person{age=25, name='Tom'}] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值