Object与equals
文章目錄
- 1. Object
- 2. equals
本文已同步到:https://www.bithachi.cn/posts/a501ac60.html
1. Object
- Object類是所有Java類的根父類
- 如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為java.lang.Object類
- 可以使用 Object 類型的變量引用任何類型的對象:
-
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 方法,會比較類中的相應屬性是否都相等
總結
以上是生活随笔為你收集整理的Object与equals的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.2.4 OS之页面分配策略(驻留集、
- 下一篇: 6.0 《数据库系统概论》之关系数据库的