Object与equals

文章目录

    • 1. Object
    • 2. equals

本文已同步到:https://www.bithachi.cn/posts/a501ac60.html

1. Object

  • Object类是所有Java类的根父类
  • 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
public class Person {
...
}
等价于:
public class Person extends Object {
...
}
  • 可以使用 Object 类型的变量引用任何类型的对象:
method(Object obj){} //可以接收任何类作为其参数
Person o=new Person();
method(o);
  • Object中的方法:

    在这里插入图片描述

  • Object 类型的变量只能用于作为各种值的通用持有者。要想对其中的内容进行具体的 操作,还需要清楚对象的原始类型, 并进行相应的类型转换:

在这里插入图片描述

在这里插入图片描述

  • 所有的数组类型,不管是对象数组还是基本类型的数组都扩展了 Object 类。

在这里插入图片描述

2. equals

  • 基本类型比较值:只要两个变量的值相等,即为true。
    int a=5; if(a==5){…}

  • 引用类型比较引用(是否指向同一个对象地址):只有指向同一个对象地址时,==才返回true。

    public static void main(String[] args) {Person p1=new Person();Person p2=new Person();Person p3=p2;Object o=p2;if(p1==p2)System.out.println("p1==p2");if(p1.equals(p2))System.out.println("p1 is equals p2");if(p3.equals(p2))System.out.println("p3 is equals p2");if(o.equals(p2))System.out.println("o is equals p2");}
    

    运行结果:

    p3 is equals p2
    o is equals p2
    

    内存分析:

    image-20200731122930031

    Object源码中equals:

    public boolean equals(Object obj) { //子类可重写return (this == obj);}
    /* 我们可以知道比较的是引用指向的对象地址是否相同,相同则返回true,不相同则返回false */
    
  • 特例 :当用equals() 方法进行比较时 ,对类File 、String 、Date 及包装类( (Wrapper Class) ) 来说 , 是比较类型及内容而不考虑引用的是否是同一个对象 ;
    原因:在这些类中重写了Object 类的equals() 方法 。

    看看String的equals:

    /*** Compares this string to the specified object.  The result is {@code* true} if and only if the argument is not {@code null} and is a {@code* String} object that represents the same sequence of characters as this* object.** @param  anObject*         The object to compare this {@code String} against** @return  {@code true} if the given object represents a {@code String}*          equivalent to this string, {@code false} otherwise** @see  #compareTo(String)* @see  #equalsIgnoreCase(String)*/  
    public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}
    
  • 当自定义使用equals()时 时 , 可以重写 。 用于比较两个对象的 “ 内容 ” 是否都相等

重写equals() 方法的原则:

  1. 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。

  2. 自反性:x.equals(x)必须返回是“true”。

  3. 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。

  4. 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。

任何情况下,x.equals(null),永远返回是“false”;

x.equals(和x不同类型的对象)永远返回是“false”

面试题:== 和equals 的区别注意事项:

  1. == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

  2. equals 的话,它是属于java.lang.Object 类里面的方法,如果该方法没有被重写过默认也是==;

    我们可以到 看到String类 等类的 的equals 方法是被重写过的,而且String 类在日常开发中了 用的比较多,久而久之,形成了equals 是比较值的错误观点。

  3. 具体要看自定义类里有没有重写Object 的equals 方法来判断。

  4. 通常情况下,重写equals 方法,会比较类中的相应属性是否都相等

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等?"+ (str1 == str2));//false
System.out.println("str1是否equals str2?"+(str1.equals(str2)));//true


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部