❶ java對象比較,equals怎麼用
對象比較,要在class裡面重寫hashcode()和equals()方法……
a=b,因為String類中重寫了這個方法;比的是值
而c!=d,因為 str類中沒有重寫這個方法;比的是內存地址
❷ java對象引用 == equals 問題
(1)==
比的是地址
(2)任何類都繼承Object類,Student是類,類使用equals方法時可以重寫Object的equals方法來說明類之間如何進行比較,
String類
就重寫了equals方法,當類沒有重寫equals方法時,Object中的equals方法默認比較兩個類的地址
(3)所以:
stu1==stu2
地址不同:false
stu1.equals(stu2)
Student沒重寫equals,比地址,地址不同:false
stu2==stu3
由於Student
stu3=stu2;
使得地址相同:true
stu2.equals(stu3)
Student沒重寫equals,比地址,地址相同:true
希望對你有幫助
:)
❸ 深入java的equals方法,怎麼比較兩個對象的
當定義一個類時,首先這個類會繼承Object類(所有類的父類)的equals方法,然後開發者可以根據具體業務場景去考慮要不要重寫equals方法。
publicbooleanequals(Objectobj){
return(this==obj);
}
上面代碼即是Object的equals方法的實現, == 判斷,即兩個對象的地址完全一樣的時候才相等。
當開發者定義類時不重寫equals方法,則實際調用中使用Object這個父類的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;
}
這就是String重寫的equals方法,可以仔細看看,很有參考價值。
接下來寫段類定義的代碼:
publicclassPerson{
privateStringname;//姓名
privateintage;//年齡
privateStringspeciality;//特長
@Override
publicbooleanequals(Objectobj){
//兩個對象是同一個時,直接returntrue
if(this==obj){
returntrue;
}
if(objinstanceofPerson){
//比較對象也是Person對象時,判斷name和age是否都相同
Personp=(Person)obj;
returnname.equals(p.name)&&age==p.age;
}
returnfalse;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSpeciality(){
returnspeciality;
}
publicvoidsetSpeciality(Stringspeciality){
this.speciality=speciality;
}
}
測試代碼:
publicclassTest{
publicstaticvoidmain(String[]args)throwsIOException{
Personp1=newPerson("張三",20,"java");
Personp2=newPerson("張三",20,"python");
System.out.println(p1.equals(p2));
}
}
根據Person重寫的equals方法可以知道,運行結果為 true
如果Person沒有重寫equals方法,那麼會調用Object的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中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()方法
當obj1==obj2不成立而obj1.equals(obj1)成立的時候,只能說明:對象obj1所屬類的equals方法被重寫了。
例如String類的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和== 區別
==是一個比較運算符,基本數據類型比較的是值,引用數據類型比較的是地址值。
(比較地址值即是指是否為同一個對象的引用)
equals()是一個方法,只能比較引用數據類型。重寫前比較的是地址值,重寫後比一般是比較對象的屬性。
(8)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使用方法
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方法的問題
String對象中有重寫Object的equals方法,重寫為比較兩個對象的值是否相等了。
你要把Object對象中的equals方法和String對象中的equals分清。