物件的相等與比較
近一年多來,拜託輕量級容器的流行,pojo的使用率也隨之上公升。pojo的功能很簡單,主要是用來在各模組之間傳遞資料。比如,有這麼乙個user類:
public class user
public int getid()
public void setname(string name)
public string getname()
…… }
這個類的功能很簡單,實現了pojo的基本功能,幾乎所有的pojo都是這麼乙個模樣。但是,僅僅這樣的功能,我們在使用中經常會感到有些不方便。比如,我們可能會在業務邏輯中比較兩個user物件是否為同乙個user。就會有如下的**:
if(user1.getid()==user2.getid())
對於這樣的**,看上去就感覺怪怪的,為什麼?我們的目的是要兩個user物件是否為同乙個user,但判斷語句卻是在判斷兩個user物件的id是否相等,看到這個語句不能給人一種是在判斷兩個user是否為同乙個user的感覺。如果改為下面的**,是否給人感覺好一些呢?
if(user1.equals(user2))
這樣一看**就知道是在比較兩個user物件是否為同乙個user,**的可讀性就強多了。
這還不是需要改造**的全部原因,如果在多個業務邏輯類裡經常出現這樣的判斷,那麼這就造成了一定的**重複,是我們所忌諱的。
其實,equals方法繼承自object類,只要我們在pojo類裡重寫該方法就可以使用了。比如,在user類裡改寫如下:
public class user
} 有了這個物件相等的方法,我們就可以在業務邏輯類中隨時使用了,而不用使用取出id的有點dirty的**了。
if(user1.getid==userid)
比如,我們在刪除user的時候,要是不是刪除了本人。這乙個判斷也不妨放在equals方法裡頭,我們在user類裡過載equals方法,如下:
public boolean equals(int userid)
呵呵,我們就可以這樣判斷:
if(user1.equals(userid))
這樣,**的可讀性也要好一點。
有了相等,就有不相等。如果不相等的話,就要比較大小。例如,對容器裡的物件進行排序或查詢,就需要比較大小了。
arrays類裡涉及到物件比較的方法有兩個:
sort(object os,comparator comparator)
binarysearch(object os,object o,comparator comparator)
然後,collections類裡也有類似的兩個方法,其他的容器類裡也應該有類似的方法。所有的這些方法都要涉及到有關物件的比較,具體就是實現comparator介面。
比如有這麼乙個employee類:
public class employee
public long getid()
public void setname(string name)
public string getname()
public void setservedyears(int servedyears)
public int getservedyears()
…… }
我們需要按員工的工作年數來排序,比如員工存在乙個陣列裡:employee emps = ……,則我們的排序**為:
arrays.sort(emps,new comparator()
});示例**1
sort方法裡的匿名內部類需要實現compare方法。該方法有兩個引數o1和o2,我們先是分別取出o1和o2的工作年數,然後,如果按照o1的工作年數大於o2的工作年數則返回乙個正數,小於則返回乙個負數,等於返回零的話,如上面的示例**1所示,則陣列按員工的年作年數的順序排序。
否則,如果按照o1的工作年數小於o2的工作年數則返回乙個正數,大於則返回乙個負數,等於返回零的話,如上面的**所示,則陣列按員工的年作年數的倒序排序。如下面的**所示:
arrays.sort(emps,new comparator()
});明白了排序的原理以後,我們可以看到上面示例**1的**還可以簡化,如下所示:
arrays.sort(emps,new comparator()
});在上面的**裡,返回的那個簡單的算式結果其實就是示例**1的那些**的變形,也是o1的工作年數大於o2的工作年數則返回乙個正數,小於則返回乙個負數,等於則返回零。
關於方法binarysearch裡的比較器和方法sort的一樣適用。需要注意的是,在使用binarysearch方法的時候,先要將陣列或者其他容器裡的物件先排序,然後才能使用該方法來搜尋某個物件。
物件相等比較
對於string型別而言,一般用 或者equales做相等比較,前者比較字串的引用,後者比較字串的值。字串常量的值儲存於常量池中,只要值相同,那麼引用的就是同乙個字串常量,也就是說,和equals效果一樣。字串物件儲存於堆中,不同的物件在堆上的記憶體位址是不一樣的。因此,建立兩個值相等的string...
kotlin 物件比較相等
在kotlin中,如何來比較物件相等?我們都知道比較相等,一般有2種概念 值相等 引用位址相等 比較基本資料型別相等,比如int,boole,string,其中string可以支援 或者equals 來比較相等 var a 1 var b 1 a b 字串比較.private fun test1 三...
js原始值與物件的相等比較
lang en charset utf 8 name viewport content width device width,initial scale 1.0 原始值與物件的相等比較title head let a let b 0 1 console.log a 0 true 2 console....