㈠ java里 equals和== 區別
==是一個比較運算符,基本數據類型比較的是值,引用數據類型比較的是地址值。
(比較地址值即是指是否為同一個對象的引用)
equals()是一個方法,只能比較引用數據類型。重寫前比較的是地址值,重寫後比一般是比較對象的屬性。
(1)javaequals對象擴展閱讀:
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方法,怎麼比較兩個對象的
當定義一個類時,首先這個類會繼承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怎麼用
equals 方法是String類從它的超類Object中繼承的, 被用來檢測兩個對象是否相等,即兩個對象的內容是否相等,區分大小寫。
例子:
s1=newString("sony");//創建的是字元串對象
s1.equals("sony");//返回true
s1=="sony"//返回false
//如果
s1="sony";
s1=="sony"//返回true
//如果
s1="sony";
s2="sony";
s1.equals(s2);或者string.equals(s1,s2);//返回true
㈣ 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使用方法
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方法
內存里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方法的覆蓋
第一個Circle 類 你寫了一個以Circle 為參數的equals方法,而它本身也有一個來源於Object 的以Object 為參數的equals方法(Java中Object是所有類的父類). 這里就有兩個equals方法了:
classCircle{
doubleradius;
publicbooleanequals(Circlecircle){
returnthis.radius==circle.radius;//Circle
}
publicbooleanequals(Objectobj){
return(this==obj);//Object
}
}
而你的circle2類型為Object ,這里就會匹配 以Object為參數的方法.這個方法是直接比較兩個對象的, 所以值是false
而第二個Circle 類 你寫了一個以Object為參數的equals方法 , 與來源於Object 的以Object 為參數的equals方法(Java中Object是所有類的父類)方法名,參數類型完全相同. 這里 你這個equals方法就覆蓋了父類Object的equals方法:
classCircle{
doubleradius;
publicbooleanequals(Objectcircle){
returnthis.radius==((Circle)circle).radius;
}
}
在此,circle1.equals(circle2)調用的就是覆蓋了equals的方法即返回的是:his.radius == ((Circle)circle).radius.
因為radius是基本數據類型,所以==比較的是他兩的值,兩個默認都為0.0 所以為true
㈧ 有關於Java中對象比較「==」和「equals()」,下面有一個程序為例
this.title的數據類型是String,屬於引用數據類型,引用類型的比較一般使用equals方法來判斷兩個對象的內容是否相等。因為this.title是一個String對象,因而可通過點運算符來調用equals方法來比較兩個String對象的內容是否相等。
this.price的數據類型是double,屬於基本數據類型,基本數據類型的比較直接使用==來判斷其值是否相等。因為this.price是一個基本類型的變數不是一個對象,因而不能通過點運算符來調用equals方法。