java和equals
⑴ java中equals方法詳解有哪些
因為你的Value類沒有重寫equals 方法,這個方法是在Object類中定義的,是可以自己按照需要進行重寫的,如果沒有重寫,其默認的邏輯是比較兩個相互equals 的對象的內存地址是不是同一個地址,第一個輸出的時候v1,v2都是new出來的,所以v1和v2在堆中是不同的內存地址,所以equals結果為false
第二個輸出,其調用的是Integer類的equals,Integer類中有重寫原有equals方法的邏輯,其邏輯是比較兩個Integer對象中封裝的數字的值,如果相同就返回true,因此第二個輸出true
第三個輸出false原理同第一個,兩個對象之間使用==比較的就是內存地址,因為都是new出來的,堆內存地址不同,所以輸出false
簡單來講,如果來自同一個類的兩個對象,如果沒有重寫equals方法的邏輯,其==結果和equals結果是相同的,如果有重寫equals方法,則==和equals結果可能會不同
⑵ JAVA中equals的用法
String類對equals()方法進行了覆蓋,只要引用指向的對象的內容是一樣的就認為他們相等。你可以看一下String的equals()的源碼:
publicbooleanequals(ObjectanObject){
if(this==anObject){
returntrue;
}
if(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
charv1[]=value;
charv2[]=anotherString.value;
inti=0;
while(n--!=0){
if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}
而Object類默認的equals()方法就是比較兩個引用指向的對象本身,如果指向同一個對象,那就認為他們是相等的,否則不相等,除非你像String類那樣對其進行覆蓋重寫。
⑶ java中equals使用方法
java中equals使用方法:
equals 方法是String類從它的超類Object中繼承的, 被用來檢測兩個對象是否相等,即兩個對象的內容是否相等,區分大小寫。
對於字元串變數來說,使用「==」和「equals()」方法比較字元串時,其比較方法不同。「==」比較兩個變數本身的值,即兩個對象在內存中的首地址。「equals()」比較字元串中所包含的內容是否相同。例如:
s1=newString("abc");
s2=newString("abc");s1.equals(s2)是true
3.對於非字元串變數來說,"=="和"equals"方法的作用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變數是否指向同一個對象。
classA
{
Aobj1=newA();
Aobj2=newA();
}
obj1.equals(obj2)是false
⑷ java里 equals和== 區別
==是一個比較運算符,基本數據類型比較的是值,引用數據類型比較的是地址值。
(比較地址值即是指是否為同一個對象的引用)
equals()是一個方法,只能比較引用數據類型。重寫前比較的是地址值,重寫後比一般是比較對象的屬性。
(4)java和equals擴展閱讀:
java中的數據類型,可分為兩類:
1.基本數據類型,也稱原始數據類型。
byte,short,char,int,long,float,double,boolean,他們之間的比較,應用雙等號(==),比較的是他們的值。
2.復合數據類型。
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果為true,否則比較後結果為false。
JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地址。
但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
對於復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。
⑸ java等號和equals之間的區別
地址,就是一個盤子;內容,就是盤子里放的食物。
等號比較的是地址是否相同,即兩個變數是不是都是指向那一個盤子,至於內容的話,如果盤子是同一個,那內容肯定一樣。
「equals是比較內容」這句話更准確的表述是,現在兩個變數都指向了一種食物,比如牛排,如果牛排是同一種的,那就相等,如果不是,那就不等。但有可能兩塊同種的牛排分別放在兩個不同的盤子里,即兩個不一樣的地址,這個時候如果你用等號來比較,那就會返回false不相等。
記得採納呦~~~
⑹ java中對象引用的列印和equals方法
內存里a和b指向的不是同一個對象,不是同一塊內存。
代碼hh
a=new
hh();是表示在棧內存里分配一塊區域給a,同時在堆內存里創建一個hh類的對象,
然後讓a指向這個對象。
代碼hh
b=new
hh();是表示在棧內存里分配一塊區域給b,同時在堆內存里創建一個hh類的對象,
然後讓b指向這個對象。
看你的hh里沒有重寫toString(),直接列印a和b應該是調用Object裡面的toString(),列印出來的是類名和此對象的十六位哈希碼,應該是不同的。
然後我把你的代碼自己運行了一下,列印出來的哈希碼也是不一樣的,不論是直接列印a和b由toString()方法默認返回的,還是調用兩個對象中的hashCode()方法出來哈希碼都是不相同的。
a.equals(b)返回的是false說明a和b不相等,我查了一下API,根據API裡面寫的
hashCode 的常規協定是:
在
Java
應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。
如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode 方法不 要求一定生成不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。
說明相同的對象,哈希碼必須相同。不同的對象,哈希碼不一定不同。
我查了下資料,哈希碼的生成函數不能保證不同對象生成的哈希碼一定相同,有很小很小的幾率會相同,
不會被你裝上了吧?
還是其他class的干擾呢?你把重新建一個文件夾,把java文件復制進去,然後編譯運行看下還是不是一樣。
我也是剛學java的,工作比較無聊我就學了下java,剛學了1個半月吧。能力有限,我把我懂得都寫出來,希望能幫到樓主。
⑺ Java中==和equal有什麼區別
Java中==和equal的區別為:
1、== 表示 判斷2個變數或對象實例是否指向同一個內存空間,equals()表示 判斷2個變數或對象實例所指向的內存空間的值是否相同。
2、== 表示 對內存地址進行比較,equals()表示 對字元串的內容進行比較。
3、== 表示引用是否相同,equals() 表示值是否相同。