現在有兩個對象,他們的一個屬性是list,很明顯兩個對象的list里面的對象,都是相等的,只是這2個list里面的順序不一致,導致這2個對象被判斷為不相等啦,這就是問題,現在要解決這個問題。
問題圖如下:
可以看到這2個對象的呢個list屬性里面數據,咱看起來是一樣的,但是經過equals之后,返回的是false。
所以,需要自己重寫equals方法和hashcode方法,這2個方法一般是一起重寫的。
然后,問題的關鍵就在于,怎么判斷2個list集合是否相等。不考慮順序。
看代碼:
先是這2個對象的代碼
tablemetadata
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.lxk.model; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; import java.util.collection; import java.util.objects; /** * table metadata. * * @author lxk */ @data @allargsconstructor @noargsconstructor public class tablemetadata { private collection<columnmetadata> columnmetadata; @override public boolean equals(object o) { if ( this == o) { return true ; } if (o == null || getclass() != o.getclass()) { return false ; } tablemetadata that = (tablemetadata) o; if (columnmetadata.size() != that.getcolumnmetadata().size()) { return false ; } return columnmetadata.containsall(that.getcolumnmetadata()); } @override public int hashcode() { return objects.hash(columnmetadata); } } |
然后是,list里面裝的對象的代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package com.lxk.model; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; import java.util.objects; /** * column metadata. * * @author lxk */ @data @noargsconstructor @allargsconstructor public final class columnmetadata { private string columnname; private string columntype; private boolean primarykey; @override public boolean equals(object o) { if ( this == o) { return true ; } if (o == null || getclass() != o.getclass()) { return false ; } columnmetadata that = (columnmetadata) o; return primarykey == that.primarykey && objects.equals(columnname, that.columnname) && objects.equals(columntype, that.columntype); } @override public int hashcode() { return objects.hash(columnname, columntype, primarykey); } @override public string tostring() { return "columnmetadata{" + "columnname='" + columnname + '\ '' + ", columntype='" + columntype + '\ '' + ", primarykey=" + primarykey + '}' ; } } |
最后就是main方法啦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.lxk.commontest; import com.google.common.collect.lists; import com.lxk.model.columnmetadata; import com.lxk.model.tablemetadata; import java.util.collection; /** * 測試equals的各種情況 * * @author lxk on 2018/9/17 */ public class equalstest { public static void main(string[] args) { testcollectionequal(); } /** * 比較2個集合是否是相同的,不考慮集合的順序,只要里面的元素確實相同即可。 */ private static void testcollectionequal() { columnmetadata c1 = new columnmetadata( "age1" , "name" , true ); columnmetadata c2 = new columnmetadata( "age2" , "name" , true ); columnmetadata c3 = new columnmetadata( "age3" , "name" , true ); columnmetadata c4 = new columnmetadata( "age4" , "name" , true ); collection<columnmetadata> list1 = lists.newarraylist(c1, c2, c3); collection<columnmetadata> list2 = lists.newarraylist(c2, c3, c1); tablemetadata table1 = new tablemetadata(list1); tablemetadata table2 = new tablemetadata(list2); boolean equals = table1.equals(table2); system.out.println(equals); } } |
如上操作之后,這個判斷就可以得到2個對象,是真的相等啦,不會因為list里面值的順序不一致,而返回false啦。
這個問題簡單嗎,簡單就簡單吧,我就喜歡簡單的問題。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/qq_27093465/article/details/82777139