zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    转 SpringCloud服务注册中心比较:Consul vs Zookeeper vs Etcd vs Eureka
    转 微服务的4个设计原则和19个解决方案
    骑士问题
    种树(洛谷P1250)
    你的飞碟在这儿(洛谷P1200)
    Hello world
    [zt][cocos2dxwin32] 安装部署流程整理
    (ZT)关于IAP防止破解的几点
    (ZT)UIImage应用与内存管理
    在Mac上发布QT的程序
  • 原文地址:https://www.cnblogs.com/hqr9313/p/2439739.html
Copyright © 2011-2022 走看看