[英]ArrayList removeAll() not removing objects
我有成員 class 的簡單 ArrayLists:
ArrayList<Member> mGroupMembers = new ArrayList<>();
ArrayList<Member> mFriends = new ArrayList<>();
會員class:
public class Member {
private String userUID;
private String userName;
public String getUserUID() {
return userUID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserUID(String userUID) {
this.userUID = userUID;
}
}
朋友的 ArrayList 包含所有用戶朋友。 我只是想做的是從好友列表中刪除群組成員,如果存在:
mFriends.removeAll(mGroupMembers);
然而它對mFriends
列表沒有任何作用......
查看日志語句,朋友確實出現在mGroupMember
列表中。
為什么這不起作用?
2個成員如何確定相等? 我猜他們是否具有相同的 ID,您認為它們相等,但是 java 希望它們在內存中是完全相同的引用,但情況可能並非如此。 要對此進行糾正,您可以覆蓋equals
函數以使其在 id 相等時返回:
public class Member {
//..
@Override
public boolean equals(Object anObject) {
if (!(anObject instanceof Member)) {
return false;
}
Member otherMember = (Member)anObject;
return otherMember.getUserUID().equals(getUserUID());
}
}
此外,當您覆蓋.equals
,建議也覆蓋hashCode
以便對象在散列函數(如Set
或Map
也能正常工作。
你必須知道
ArrayList#removeAll(Collection)
打電話給
ArrayList#contains(Object)
調用
ArrayList#indexOf(Object)
最后調用
Object#equals
因此,如果equals
未正確覆蓋(遵循equals
合同規則),則您將無法獲得正確的行為。
正如評論中提到的,來自ArrayList
元素只有在它們的equals()
方法返回 true 時才會被刪除。 非覆蓋方法基於引用檢查相等性(即它們必須是內存中的同一對象)。
您可能想要的是覆蓋equals
以基於Member
的屬性,例如在下面的示例中:
@Override
public void equals(Object o) {
if(o == null) {
return false;
} else if (!(o instanceof Member)) {
return false;
} else {
return ((Member) o).getUserUID().equals(this.userUID) && ((Member) o).getUserName().equals(this.userName);
}
}
此外,你應該重寫hashCode()
重載時equals()
這樣,當兩個對象是相等的,它們有相同的哈希碼。 hashCode 的非覆蓋實現也基於引用相等。
編寫一個程序,接收汽車的進出時間,計算出汽車在停車場停留了多少小時和多少分鍾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.