欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object类之toString方法和equals方法

程序员文章站 2022-03-18 11:28:42
...

Object类之toString方法和equals方法

位于rt.jar\java\lang\Object.class
  注意:Object类是所有类的父类(Java中只有一个根基类,C++中有多个),若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法:
  所有对象,包括数组,都实现了Object类的方法。
  我们写的所有的类都是Object的子类会继承Object这个类所有的属性和所有的方法:
  1) Object中有3个非常重要的方法 hashcode(), toString(), equals(),sun都是建议我们写自己的类的时候,最好都重写上述3个方法

1.toString()方法

描述对象的方法,用一个文本信息来描述当前对象 ,一般是把属性显示出来.

  • 默认调用toString方法的时候,返回的结果:
    包名.类名@hashcode;
    必须重写该方法
  • 当输出对象的名字的时候,系统就会默认去调用
    toString()方法

Object类之toString方法和equals方法

        Object a = new Object();
        String b = a.toString();//获得一个对象的字符串,表示形式是一个地址
        System.out.println(b);

輸出:aaa@qq.com
类名(对象是该类的一个实列)aaa@qq.com+此对象哈希码的无符号十六进制

2 “==”与equals()

  • a) “==” : 比较的是基本数据类型的对象,是否相等
  eg :
  Person p1 = new Person();
  Person p2 = new Person();
  System.out.println(p1==p2);//false

 p1==p2 :比較的是内存地址值,不相等
- b) “equals”:是sun专门用来判断两个对象属性是否相等
方法

3 equals():

  • a) equals()为什么需要重写?
    默认的是比较两个对象的引用是否是同一地址
    重写equals()方法后,让他们指向同一个引用,可以判断对象的属性相等
    @Override
    public boolean equals(Object obj) {
        //参数的特殊情况
        //null, this, 类型不一致
        if(obj==null) return false;
        if(obj==this) return true;
        if(!(obj instanceof Point)) return false;

        Point p = (Point) obj;
        return x == p.x && 
               y == p.y;
    }
        String s1 =p1.toString();//获得一个对象的字符串,toString()已被重写
        System.out.println(s1);  

        Object a = new Object();
        String b = a.toString();//获得一个对象的字符串,表示形式是一个地址
        System.out.println(b);

        Point p2 = new Point(3,4);
        String s2 = p2.toString();
        System.out.println(s2);
        /**重写equals()方法后,输出p1==p2:false,p1.equals(p2):true*/
        System.out.println(p1==p2);//==比较的是对象内存地址  -false
        System.out.println(p1.equals(p2)); //重写equals方法后,它比较的是对象内部属性-true

重写equals()方法后,输出p1==p2:false,p1.equals(p2):true

4 hashCode():

a)hashCode:创建对象在堆内存中的地址值经过一系列
     非常复杂的算法转化而来的一组数字,对开发来说无意义
b)如果两个对象相等话,
第1个条件:equals返回的结果必须是true
第2个条件:必须要有相等的hashCode
c)如果两个对象不相等,则hashCode值一定不等
d)判断对象是否相等的时候,必须要重写equals和
hashCode

5instanceof

判断一个对象是否是某个类的对象
格式: 对象 instanceof 类名
如果是返回true,否则false
if(obj instanceof Point){
Point p = (Point) obj;


Object类中的toString(),equals(), hashCode()方法之间的关系

  • 1、在没有重写之前:

      1) toString()方法返回的是对象的:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode()) 比如:aaa@qq.com
      2) equals():对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)克隆的对象和原来的对象不是同一个对象。对象地址不一样
      3) hashCode():由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的)。
      

  • 2、重写之后:
     1) toString()方法一般返回的是:属性的拼接
      @Override
      public String toString() {
        return “Person2 [name=” + name + “, age=” + age + “]”;
      }
      2) equals()方法:重写之后一般只要自定义为两个对象的所有属性值相等就返回为true;
      3) hasdCode():重写hashCode,
      @Override
      public int hashCode()
      {
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + getId();
        return result;
      }
     

  • 3、总结

      1) 对象相等则hashCode一定相等;

      2) hashCode相等对象未必相等。也就是说两个不同的对象也有可能hashCode(散列码(取余得出的))相同

      判断两个对象是否相等的条件:
      没有重写的话,只要hashCode不相等那么两个对象一定不相同,
      重写的话,首先判断hashCode如果不一样,那么两个对象不相等,如果hashCode一样的话,再比较equals,如果true就相同,否则不相等。