物件的相等與比較

2021-04-15 16:32:45 字數 2294 閱讀 4252

物件的相等與比較

近一年多來,拜託輕量級容器的流行,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....