java對象的比較
1. java對象的比較
比較對象的時候有兩種相等的情況(看你需要哪一種)
第一種:地址相等,通過==號來比較他們是否是指向同一個地址
第二種:他們的屬性相等,有時候兩個對象只要他們的屬性相等我們就認為他們兩個是相等的,那麼這種比較就需要你自己重載equals方法,然後在裡面判斷他們的屬性,如果他們的屬性全班相等或根據你的需要哪些相等那麼他們就相等
比如有一個正方行類
Square s1 = new Square(5);
Square s2 = new Square(5);
這時候你只需他們的邊長相等,就認為他們是相等的,那麼equals方法就可以這樣寫
@Override
public boolean equals(Square s) {
return this.side = s.getSide();//side是邊長
}
2. 深入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
所以實際怎麼比較兩個對象這完全是看開發者也就是你自己的意思
3. java怎麼比較2個對象
//抽象父類
abstract class CompareObject {abstract double compareTo();}
//派生子類
class Position extends CompareObject {
double x,y;
public Position(double g,double h) {this.x=g;this.y=h;}
public double getx(){return x;}
public double gety(){return y;}
public static double compareTo(Position a,Position b) { //自己派生的方法
return Math.sqrt(a.x*a.x+a.y*a.y)-Math.sqrt(b.getx()*b.getx()+b.gety()*b.gety());
}
/*繼承父類的比較方法作用到子類對象中,必須在父類裡面定義比較的方法體,而你這里沒有。所以你可以選擇自己重新定義一個方法體。
* 也可以在父類裡面寫好比較的方法體。
*/
double compareTo(CompareObject ca, CompareObject cb) { //實現父類中的方法
// TODO Auto-generated method stub
return 0;
}
public static void main(String[] args){
//比較2點與原點距離之差
Position a=new Position (5,4);
Position b=new Position (7,3);
System.out.println("兩點到原點的距離之差為"+compareTo(a,b));
}
@Override
double compareTo() {
// TODO Auto-generated method stub
return 0;
}
}
4. java怎麼只比較兩個對象的內容
使用 == 進行比較, 該方式比較的是變數是否同時指向一塊內存地址,如果是就返回true,否則返回false
使用對象本身的equals進行比較,equals首先會進行 == 比較,然後會進行邏輯比較,當然你可以自己定義自己的比較邏輯,比如JDK內置的String,Integer,Long等都是重寫了這個equals方法的。
總的來說就是 == 表示完全相等,而equals表示邏輯相等
5. java怎麼比較2個對象
你這個compareTo方法是幹啥的?思路不清啊....
你應該寫的是一個點的對象(Position)..他要和別一個點(Position )去比較.所以至少你的Position 類中的compareTo這個方法里要獲得別一個點的對象.
也就是說應該在實現類中有這樣的形式
點1對象.compareTo(點2對象);//說白了就是你的實現類里這行
System.out.println("兩點到原點的距離之差為"+compareTo());
應該改成
System.out.println("兩點到原點的距離之差為"+a.mpareTo(b);
在計較的時候.也就是你的compareTo()這個方法里..就應該是對象1的距離-對象2的舉例
也就是類似這樣的.
Math.sqrt(a.getx()*a.getx()*+a.gety()*a.gety())-Math.sqrt(b.getx()*b.getx()+b.gety()*b.gety();//
6. java中怎樣比較兩個對象是否為同一個對象
一.跟對象比較的幾個相關的概念。
為了更加審核的理解對象比較的含義以及多個比較方法之間的差異,筆者認為讀者首先需要了解幾個相關的概念,或者說幾對關系。
1.是類與對象的關系。類是具體的抽象,而對象是類的具體實現。這可能聽起來還是有點模糊。做一個形象的比喻,類就好像是用來製作塑料盒子的模具,只要將PVC料注入到這個模具中就可以生產對應形狀的盒子。而對象就好像是生產出來的盒子。雖然模具同一個,但是生產出來的盒子彼此之間仍然是不同的。一方面先天性就是不同的。因為根據相對論可以說明世界上沒有兩個相同的東西。其次後天性的影響,也會導致其不同。如生產出來後,在兩個盒子上分別貼上不同的條碼,他們兩個就代表不同的盒子了。了解這個類與對象之間的關系,對於了解對象之間進行比較,會有很大的幫助。
2.是需要知道類與對象在內存中的實際存儲情況。當程序員定義一個類時(不含有靜態成員或者變數),一般不會在內存中給其分配一個存儲結構。而只有定義對象時,才會在內存中分配存儲結構。當利用同一個類定義不同的對象時,系統會在內存中為不同的對象創建不同的存儲結構。也就是說,會對應不同的內存地址。雖然同一個類中定義出來的對象,其內容可能相同(成員變數、成員方法等等都相同),但是其內存中的地址仍然是不同的。
3.是需要注意對象的復制問題。如果要創建幾個內容相同的對象,即復制相同內容的對象,現在主要有兩種方法。一是通過成員變數賦值來完成。如在根據同一個類創建對象時,分別給與他們相同的初始化值。那麼這兩個對象的內容就是相同的。二是通過地址賦值來完成。即將第一個對象在內存中的地址賦值給第二個對象。此時兩個對象名字雖然不同,但是他們卻指向內存中的同一塊區域。此時就好像一個人有兩個名字,其實是同一個人。所以這兩個對象內容也就相同了。
二.利用==運算符與equals方法來比較對象。
在Java語言中,主要可以利用==運算符(兩個等號)和equal函數來對對象進行比較。不過這兩個符號其實現的機制不同。或者說,對於同樣的兩個對象,如果利用他們來進行比較的話,往往會有不同的結果。如String是Java自定義的對象,其主要用來存儲字元串數據。現在筆者利用如下語句定義了三個String對象。
◆String str1=new String(「welcome」); //創建一個對象,給利用單詞welcome初始化
◆String str2=new String(「welcome」); //創建一個對象,給利用單詞welcome初始化
◆String str3=str1; //創建一個對象,並利用對象str1的地址賦值
以上三個對象,顯而易見,其內容都是相同的。但是利用這個兩種方式來對他們進行比較的時候,往往會有不同的結果。如利用==(兩個等號)比較符號來進行比較,str1==str2,最後返回的結構是false,也就是他們是不相同的對象。可是如果比較str1==str3對象,則最後返回的結果卻是true。但是利用equal函數來比較,則返回的結果是相同的。為什麼對象的內容相同,它們返回的結果卻是不同的呢?
要回答這個問題,就需要大家先回顧一下筆者上面談到的幾對關系。首先,對象str1與對象str2的關系,就好像是同一個模具出來的兩個盒子,他們從外觀看起來雖然相同,但是通過放大鏡或者其他精密儀器仍然可以看到,兩個盒子是不同的東西。這兩個對象雖然內容相同,但是其在內存中分配的地址不同。也就是說,是同一個模具出來的外觀看起來相同的不同的盒子。而對象str1與對象str3就好像是一個人有兩個名字。雖然名字不同,但是實際上是同一個人。這主要是因為他們的身份證號碼相同。其實這個身份證號碼就好像是內存中發配的地址,而對象名字就好象是人的名字。一個人可以有好幾個名字(一個對象有好幾個名字),但是其身份證號碼只有一個(內存分配地址只有一個)。在上面的語句中,通過str3=str1,其實現的功能,並不是將對象str1的值賦值給對象str3。而是將對象str1在內存中的地址賦值給了對象str1(就好像是將一個人的身份證號碼復制給了另外一個人)。所以從本質上說,str3並不是一個新建立的對象。因為系統並沒有在內存中為其分配一個新的存儲區域(即並沒有創造一個新的人),而只是好像給對象另外取了一個別名。
所以說,在對象比較的時候,需要搞清楚一個問題。即現在要比較的是他們的內容還是在內存中指向的地址。一般來說,內容相同不一定他們在內存中指向的地址也是相同的。而不同的對象在內存中若指向同一個地址,則他們的內容肯定是相同的(因為他們實際上就是同一個對象)。而==(兩個等號)運算符與 equal函數就是運來比較這兩塊內容的。其中==運算符是用來比較內存中的地址是否相同,即比較它們的身份證號碼是否相同。而equal函數則只比較他們的內容。如果他們的內容相同,即使身份證號碼不相同(內存中的地址不同),這個函數也人們他們是相同的,會返回TRUE值。這就是這個兩個對象比較方式的最大不同。或者說,他們在對對象進行比較時,出發點不同。一個比較對象名字所指向的內存地址是否相同,另外一個比較的時對象名字所指向的存儲模塊中的內容是否相同。所以他們就會返回不同的結果。
三.慎用內存地址賦值。
在實際工作中,筆者提醒程序開發人員,要慎用這種str3=str1內存地址的賦值形式。其實,利用這種形式來創建對象,其實根本沒有創建一個新的對象。而只是將兩個對象同時指向內存中的同一個存儲區域。由於他們實際上是同一個對象,為此通過其中一個對象修改了對象的內容,那麼另外一個對象名字調用的對象其也會受到影響。也就是說,它們相互之間缺乏獨立性。為此在創建對象的時候,如果沒有特殊的必要,最好為不同的對象名創建不同的實體對象。而不要將多個對象名指向同一個對象,這在開發應用程序的時候容易導致對象內容被無意中修改,從而導致應用程序結果出錯。
最後筆者需要提醒的是,在選擇對象比較方式的時候,要了解==運算符與euqal函數之間的差異。如果只是想比較對象的內容是否相同,則只需要使用equal函數即可。但是如果要比較他們是否是同一個對象,即在內存中是否指向同一個存儲區域,則需要使用==運算符。在實際應用的過程中,千萬不能夠張冠李戴。否則的話,很容易導致相反的結果。特別是將他們返回的值當作條件判斷語句時,更加需要謹慎。因為此時如果選擇的方法錯誤,則最後產生的結果往往是相反的。所以在對象進行比較時,跟變數的比較有很大的差異。在對象的比較上,程序員要謹慎行事。最根本的一點就是要搞清楚,到底比較的是什麼東西,是對象內部的存儲內容還是在對象名字與內存之間的關聯關系(對象內存地址)。搞清楚這一點後,那麼到底選擇採用哪種方式來進行比較也就引刃而解了。