equals與==的區別(詳解)
前言
本文主要中原始碼的解釋上去看兩者的區別
==
對於基本資料型別來說,==比較的是兩者的值;對於引用型別來說,==比較的兩者的記憶體地址。
equals
對於基本資料型別來說,沒有equals方法;對於引用型別來說,equals比較的可能是記憶體地址,也可能是記憶體地址和值都比較,從equals的實現上來說,其實用的比較也是==,所以equals的具體比較得看重寫後的方法。具體如下:
對於Object型別來說,equals方法比較的是兩者的記憶體地址。但很多型別都重寫了equals方法,例如常用的String型別比較的就是記憶體地址和值,具體解析看如下原始碼。
-
Object
public boolean equals(Object obj) { return (this == obj); }
-
String
public boolean equals(Object anObject) { // 第一個if,判斷兩者是否是同一個記憶體地址 if (this == anObject) { return true; } // 第二個if,判斷兩者的值是否相同(將每個字元逐一比較) 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方法重寫注意點
- 自反性:對任意引用obj,obj.equals(obj)的返回值一定為true.
- 對稱性:對於任何引用o1、o2,當且僅當o1.equals(o2)返回值為true時,o2.equals(o1)的返回值一定為true;
- 傳遞性:如果o1.equals(o2)為true, o2.equals(o3)為true,則o1.equals(o3)也一定為true
- 一致性:如果參與比較的物件沒任何改變,則物件比較的結果也不應該有任何改變
- 非空性:任何非空的引用obj,obj.equals(null)的返回值一定為false
參考
[1] https://zhidao.baidu.com/question/61622858.html
相關文章
- Java中(==)與equals的區別Java
- Java之String的equals與contentEquals區別Java
- Java面試題 equals()與"=="的區別?Java面試題
- Java基礎-- ==號與equals()方法的區別Java
- 詳解iframe與frame的區別
- javaSE中的==和equals的聯絡與區別Java
- ==和equals方法的區別
- 【Java】equals 和 == 的區別Java
- synchronized與Lock的區別與使用詳解synchronized
- TCP與UDP區別詳解TCPUDP
- cookie和session的詳解與區別CookieSession
- java字串“==”與“equals”的差異及與c#的區別Java字串C#
- java 中equals和==的區別Java
- Kafka與ActiveMQ的區別與聯絡詳解KafkaMQ
- 詳解Kafka與ActiveMQ的區別與聯絡!KafkaMQ
- Java中equals與==的本質區別是什麼?Java
- Java運算子>>與>>>區別詳解Java
- rem與em的使用和區別詳解REM
- xargs 命令詳解,xargs 與管道的區別
- table中cesllspacing與cellpadding的區別詳解padding
- PHP isset()與empty()的使用區別詳解PHP
- cookie與session的區別(圖文詳解)CookieSession
- 【ASP.net】Equals 和 == 的區別ASP.NET
- hashCode()和equals()的區別?(skycto JEEditor)
- 深入理解equals和==的區別
- Java中 equals() 方法和 == 的區別Java
- Python之列表與元組的區別詳解Python
- 你真的知道 == 和 equals 的區別嗎?
- 你真的懂 == 和 equals 的區別嗎?
- 主流RPC框架詳解,以及與SOA、REST的區別RPC框架REST
- systemctl的操作詳解總結及其與service的區別
- C#基礎之==(雙等於號)與equals()區別C#
- 第四章 ==和equals()的區別
- Java基礎- ==和equals和hashCode的區別Java
- JRE 和 JDK 的區別詳解JDK
- MyBatis中#{}和${}的區別詳解MyBatis
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- Java經典面試題: == 和 equals( )的區別Java面試題