toString()
方法,==
運算符和equals()
方法如何在引用和基本類型上以不同方式或類似方式工作?toString(),==,equals()對象方法在引用和基本類型上的工作方式有何不同或相似?
回答
對於引用類型,==會比較實際引用(在對象所在的內存中的位置),其中equals方法執行數據比較。
出於性能方面的原因,JVM有時會爲您的不可變字符串「實習」字符串。導致此:在參考對象的情況下
String a = "abc";
String b = "abc";
if (a == b){
//The if statement will evaluate to true,
//if your JVM string interns a and b,
//otherwise, it evaluates to false.
}
的「==」操作符對你有基本類型,即引用本身。即a == b
將比較原始類型的值爲int,但會比較引用類型的引用(而非值)。當調用equals()
方法時,兩個不相同但具有相同值的引用類型對象將返回true
,但a == b
將爲false。
對於原始類型,調用方法時,類型先前被轉換(裝箱)爲引用類型,然後調用該方法。這意味着對於基本類型a == b
將產生與a.equals(b)
相同的值,但在後一種情況下,會在調用equals()
方法之前創建兩個臨時盒裝對象。這會使操作在CPU時間上更加昂貴,這可能會或可能不會成爲問題,具體取決於它發生的位置。
也就是說,要比較原始類型值,您應該使用==
,而要比較參考類型值,您應該使用.equals()
方法。
與toString()
方法相同。當調用引用類型的對象時,它會調用適當的方法併產生一個String。在基元類型上調用時,該類型將被自動裝箱,然後該方法將在臨時對象中調用。在這種情況下,您可以調用適當的toString()
靜態方法(即對於int調用Integer.toString(myint)
),這將避免創建臨時對象。
如果'a'是一個基本類型'a.equals(b)'不會編譯。 – ajb 2013-10-31 00:24:53
對於常規類型(包括字符串):
==
比較對象的引用。它測試兩個對象引用是否相等;即它們是否指代相同的對象。equals(Object)
測試此對象是否「等於」另一個。 「等於」的含義取決於對象的類如何定義平等。java.lang.Object
類定義equals(other)
爲this == other
,但許多類覆蓋此定義。toString()
提供了對象到字符串的簡單轉換。結果字符串的格式和內容是特定於類的,並且(從合同的角度來看)並不保證它是有意義的。
對於(真)原語類型:
==
比較類型的值,和equals()
和toString()
沒有定義。 Java不允許你調用原始值的方法。
然而,這是複雜的,因爲在某些情況下 Java語言說,一個基本類型可以「autoboxed」所帶來的基本類型的相應的包裝類型的實例;例如int
對應於java.lang.Integer
等等。對於包裝類:
==
被定義一樣的任何其他引用類型,equals()
比較包裹值,並且toString()
格式化包裹值。int a = ... int b = a; Integer aa = a; // autoboxing occurs Integer bb = b; // autoboxing occurs assert a == b; // always succeeds assert aa.equals(bb); // always succeeds assert aa == bb; // sometimes succeeds, sometimes fails.
的原因,過去有時會失敗,就是JLS不保證自動裝箱給定的原始值將始終給予同樣的包裝:
在作品中的扳手通過以下所示目的。它會在某些情況下(例如對於小整數),而不會對其他人(例如大整數)。
從上面的例子中可以學到的教訓是,在參考類型上使用==
時需要非常小心。只有當你使用時想要測試兩個引用是否屬於同一個對象。不要使用它,如果你只是想測試對象是否「相等」而沒有調用equals()
的開銷。
(另請注意,String
是另一種類型,其中==
是想給你錯誤的答案在許多情況下,見How do I compare strings in Java?)。
基元上的'=='只檢查值並忽略這些類型。 'int x = 5;長y = 5L;字節b = 5; x == y; b == x;'兩者都返回true。 – arun 2014-03-21 14:06:12
它不是「忽略」的類型。其中一個或其他操作數正被提升爲另一個操作數的類型。此外,我說「類型的值」... – 2014-03-21 14:23:53
- 1. 通過相同的基類的不同的對象的方法
- 2. equals方法不工作
- 3. 根據相同類型的對象調用對象方法
- 4. Powershell對於兩個類似的操作工作方式不同
- 5. toBoolean方法類似toString
- 6. toString,hashcode和equals方法內部接口
- 7. 爲什麼toString()方法的工作方式不同數組和ArrayList對象之間的Java
- 8. toString方法如何工作?
- 9. Java對象中的HashCode和Equals方法
- 10. 硒頁面對象模型 - 方法調用的工作方式?
- 11. C#==在值類型和引用類型方面有所不同?
- 12. 的toString()的工作方式不同Firefox和IE
- 13. Java快equals方法對於float類型
- 14. 覆蓋Object類的equals和toString方法的Java die程序?
- 15. 作爲字符串類是對象類的toString()在對象類方法的返回類型如何爲String
- 16. DelegateClass和類似方法在哪個對象/類上存在?
- 17. 休眠工具的toString和equals方法產生
- 18. 創建不同的對象或相同的取決於類型(基本Python)
- 19. 泛型方法或繼承相似對象
- 20. 如何使用equals方法比較不同類別中的對象數組
- 21. 當傳遞對象引用或基本類型作爲參數時,void方法的行爲如何
- 22. C#泛型和抽象工廠模式 - 或者某種類似的方式
- 23. Java泛型方法和方法對象作爲參數有什麼不同?
- 24. equals()方法被調用現有對象或傳入對象在集合
- 25. equals()方法和==是否相等或不相等?
- 26. 不同類型的具有相同名稱的調用方法
- 27. toString方法在jQuery中?或類似的東西
- 28. 如何在基類對象上調用子類方法?
- 29. 類似對象的通用方法
- 30. 使用超類的方法相同的方法對亞類的對象
學會了一個新概念 - 實習! – lft93ryt 2017-03-27 04:00:18