欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Object与equals

发布时间:2024/10/14 编程问答 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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

    内存分析:

    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() 方法的原则:

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

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

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

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

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

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

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

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

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

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

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

  • 通常情况下,重写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

    总结

    以上是生活随笔为你收集整理的Object与equals的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。