Java面向对象——toString(),equals(),hashCode()

1 Object
1)java的类默认继承于Object! -> 啥都是东西
  继承了Object的属性和方法
  如:toString, hashCode(), equals()
2)关于toString 方法
  toString()方法是在Object定义的,Java API经常默认调用这个方法输出对象的文本描述
  如:println(obj)方法在输出对象时,默认调用obj.toString()作为输出结果
  Object的toString()方法返回的是"全限定名@hashCode"
  其中:全限定名= package +calssName
          hashCode =对象内存地址经过算法换算成的一个整数,不是地址!
  java 建议覆盖这个方法!覆盖为"合理的对象文本描述"
例子

 1 public class ObjectDemo {
 2  public static void main(String[] args) {
 3   Object p = new Point(); 
 4   System.out.println(p.toString()); 
 5   System.out.println(p);  
 6  }
 7 }
 8 class Point /*extends Object*/{
 9  int x;
10  int y;
11  public String toString(){ //覆盖Object的toString()
12   return "("+x+","+y+")";
13  }
14 }


输出结果
(0,0)
(0,0)

3) equals是用来比较两个对象是否相等的方法。
区别:引用相等 与 对象相等
引用值相等:使用"==",比较引用相当于比较对象的物理位置使用一致
不能用来比较对象,不能比较逻辑上对象是否相等

对象的内容相等:.equals()方法
equals在Object类中声明,默认比较的规则是:比较引用的值(就是==)
equals()的默认实现不是很好,建议覆盖!
覆盖为合理的对象相等逻辑:根据关键属性比较是否相等
例子

 1 import java.util.Arrays;
 2 
 3 public class EqualsDemo {
 4  public static void main(String[] args) {
 5   Node n1 = new Node(8,8);
 6   Node n2 = new Node(8,8);
 7   System.out.println(n1==n2);//false  ==比较变量的地址值,是对象内存地址值
 8   System.out.println(n1.equals(n2));//true 覆盖了equals()方法
 9   
10   Node[] nodes = {new Node(1,1), new Node(3,3)};
11   Node[] others = {new Node(1,1), new Node(3,3)};
12   //Arrays.equals会默认调用每一个对象元素中的equals方法
13   System.out.println(Arrays.equals(nodes, others));//true
14  }
15 
16 }
17 
18 class Node{
19  int i,j;
20  public Node(int i,int j){
21   this.i = i;
22   this.j = j;
23  }
24  public boolean equals(Object obj){
25   if(obj==null){  //判断obj是否为空
26    return false;
27   }
28   if(this == obj){ //判断是否是同一个引用
29    return true;
30   }
31   if(obj instanceof Node){//判断obj是否是Node的一个实例
32    Node other = (Node)obj;
33    return this.i == other.i && this.j == other.j;
34   }
35   return false;
36  }
37 }


输出结果:
false
true
true

注意:当equals()方法被重写时,通常有必要重写hashCode方法
4)hashCode()方法
* 应该与equals() 方法一同覆盖,保证:
* 当两个对象相等时返回同一个整数,
* 两个对象不同时,返回尽可能不同的整数。
* 这个方法不是来比较对象是否相等的,是用于"散列表技术"(请参考集合章节)

例子:补充在上述例子中的代码

1  public int hashCode(){
2   return i*1000+j; //为了满足以上随便写的算法
3  }


注:Java API基本都是覆盖了toString()  equals()  hashCode()

原文地址:https://www.cnblogs.com/hqr9313/p/2439739.html