equal(),hashcode(),toString()方法的作用

时间:2022-02-04 16:00:58


这三个方法都是java.lang.Object的方法。

equal();判断两对象是否相等
hashcode();为对象在容器中添加一个标识;
toString();把对象转成字符串;

 

重写equal 的同时为什么必须重写hashcode?

注意:当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

hashCode是编译器为不同对象产生的不同整数,根据equal方法的定义:如果两个对象是相等(equal)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equal为true,hashCode必须为true,equal为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步。

 

toString

public String toString()
返回该对象的字符串表示。通常, toString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。

equals

public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。

equals方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 xx.equals(x) 都应返回 true
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true时,x.equals(y) 才应返回 true
  • 传递性:对于任何非空引用值 xy 和 z,如果 x.equals(y) 返回 true,并且y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals比较中所用的信息没有被修改。
  • 对于任何非空引用值 xx.equals(null) 都应返回 false

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 truex == y 具有值true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

 

 

参数:
obj- 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回  true;否则返回  false
另请参见:
hashCode()Hashtable
 
 

hashCode

public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如  java.util.Hashtable提供的哈希表)的性能。 

hashCode的常规协定是: 

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM编程语言不需要这种实现技巧。)


为什么一个好的类需要覆写 toString()、hashCode()、equals()方法

(2013-09-26 22:57:45)equal(),hashcode(),toString()方法的作用转载
标签: 

it

 

      第一 覆写toString()

为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码:

 
     
  1. public class Client {  
  2.      public static void main(String[] args) {  
  3.         System.out.println(new Person("张三"));  
  4.      }  
  5. }  
  6.  
  7. class Person{  
  8.      private String name;  
  9.  
  10.      public Person(String _name){  
  11.           name _name;  
  12.      }  
  13.        

 

输出的结果是:Person@1fc4bec。如果机器不同,@后面的内容也会不同,但格式都是相同的:类名 + @ + hashCode,这玩意就是给机器看的,人哪能看得懂呀!这就是因为我们没有覆写Object类的toString方法的缘故

第二 覆写hashCode()、equals()

      这种做法一般是为了增强自定义类的扩展性,尤其是当该类的对象要存入HashSet集合时,覆写这两个方法尤为重要。覆写equals方法之后,可以实现对象的自定义比较,如果不覆写此方法,默认调用Object的equals方法,等同于比较地址值。如果一个类不覆写Object中的hashCode方法,而直接调用该方法,得到的哈希值是由系统计算出的,返回值和对象属性之间没有直接联系。覆写hashCode方法,可以根据对象属性的不同,返回相应的哈希值。
具体到HashSet集合中对这两个方法的调用步骤,如下:
1)当向集合中存入一个元素时,会调用该元素的hashCode方法,得到该对象哈希值,如果集合中已有元素的哈希值和该元素的哈希值不重复,该元素被存入集合。
2)如果要存入元素的哈希值和已有元素的哈希值相同,会进一步调用equals方法,比较这两个元素是否相同,如果不同,该元素依然会被存入集合,如果相同,则认为这两个元素相同,由于集HashSet集合中不能存入相同元素,所以存储动作不会成功。
需要说明的是:覆写这两个方法并非必须。如果只是编写一个用于测试的简单类,完全没有必要一定覆写这两个方法。只是一般开发中考虑到程序的扩展性,或者该类对象有可能被存储到HashSet中,覆写这两个方法可以为以后程序的升级提供方便。当然,一个好的类,一般会覆写Object中的equals方法、hashCode方法、toString方法等。