您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中equals與==的區別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
背景介紹
== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。
equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。
java中的數據類型可以分為兩類:
基本數據類型
byte,short,char,int,long,float,double,boolean
基本數據類型之間的比較需要用雙等號(==),因為他們比較的是值
引用數據類型
接口、類、數組等非基本數據類型
Java中的字符串String屬于引用數據類型。因為String是一個類
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。因為沒new一次就會重新開辟一個新的堆內存空間
Entity entity = new Entity(); Entity entity1 = new Entity(); Entity entity2 = entity; System.out.println(entity==entity2); System.out.println(entity.equals(entity2)); System.out.println(entity.equals(entity1)); System.out.println(entity==entity1);
執行結果
true
true
false
false
equals()方法介紹
Java中所有的類都是繼承與Object這個基類的,在Object類中定義了一個equals方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫中已經重寫了這個方法(一般都是用來比較對象的成員變量值是否相同),比如:String,Integer,Date 等類中,所以他們不再是比較類在堆中的地址了、
Object類中源碼
public boolean equals(Object var1) { return this == var1; }
String類中重寫后的代碼
public boolean equals(Object var1) { if (this == var1) { return true; } else { if (var1 instanceof String) { String var2 = (String)var1; int var3 = this.value.length; if (var3 == var2.value.length) { char[] var4 = this.value; char[] var5 = var2.value; for(int var6 = 0; var3-- != 0; ++var6) { if (var4[var6] != var5[var6]) { return false; } } return true; } } return false; } }
總結:
對于復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值,跟雙等號(==)的結果相同;如果被復寫,按照復寫的要求來。
== 的作用:
基本類型:比較的就是值是否相同
引用類型:比較的就是地址值是否相同
equals 的作用:
引用類型:默認情況下,比較的是地址值,重寫該方法后比較對象的成員變量值是否相同
String類的equals()方法
在之前文章介紹JVM的時候,提到過一個常量池,這里咱們再來介紹下
String a = "abc";// abc在常量池中 String b = "abc";//棧中b指向常量池中的abc String c = new String("abc");// 在堆內存中重新開辟了一個abc的空間 String d = c.intern();//檢查字符串池里是否存在"abc"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然后再返回它的引用。 System.out.println(a==b); System.out.println(a.equals(b)); System.out.println(a==c); System.out.println(a.equals(c)); System.out.println(a==d); System.out.println(a.equals(d));
true
true
false
true
true
true
看完上述內容,你們對Java中equals與==的區別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。