equals()、hashCode()和toString()

最近在补Java基础,从前一直不明白equals()、hashCode()和toString()这几个的关系,今天看了些博文和参考《Java编程思想》,并做以下总结。

1)toString():

  • (1)Object的方法;
  • (2)没被重写的情况下,返回堆区中Java对象的字符串表示形式(等同看做Java对象的内存地址); 在基本类型中,“==”比较的是对象的值;在非基本类型中,“==”比较的是对象的实际存储的内存地址。

2)equals():

  • (1)Object的方法;
  • (2)没被重写的情况下,  equals默认情况下内部就是“==”比较;

3)hashCode():

  • (1)Object的方法;
  • (2)在object类中,hashcode()返回的是对象的地址值,
  • (3)而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode() 也就相等了;

4)解析为什么“当重写一个对象的equals方法,就必须重写他的hashCode方法?” 简答:像在HashSet当中,是不允许两个相同的对象插入集合中的。在HashSet在插入对象时,经过以下步骤:

  • (1)首先是通过预插入对象的hashCode判断插入对象属于hash列表的哪一个队列中。
  • (2)找到线性队列后,再通过equals()方法和线性队列中的元素做比较。 假设有一个类重写了equals()方法,而没重写hashCode()方法,这个类有两个对象,分别是a和b,其中a.equals(b) == true,现在要在Hashset中插入a和b对象。则在将这两个对象插入HashSet中时,a对象和b象的hashCode不同(不同对象的地址不同,所有hashCode也不同),则计算得到hash队列很有可能不同(步骤1),这时再用equals()方法去和线性队列中的元素去比较时(步骤2),自然没有相等的元素,这时a和b对象都插入了HashSet中。这违背的HashSet规则。所以,当重写一个对象的equals方法,就必须重写他的hashCode方法,这样才能保证equals()方法相同时,hashCode()也一定相同。 更详细的equals()和hashCode()解析,参考: http://blog.csdn.net/jiangwei0910410003/article/details/22739953 (这是我看到过的最详细,最清晰的解析)

猜你喜欢

转载自my.oschina.net/u/3696939/blog/1553619