簡體   English   中英

ArrayList removeAll() 不刪除對象

[英]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以便對象在散列函數(如SetMap也能正常工作。

你必須知道

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM