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