ArrayList removeAll()不删除对象

Sau*_*ron 5 java android arraylist

我有成员类的简单ArrayLists:

ArrayList<Member> mGroupMembers = new ArrayList<>();
ArrayList<Member> mFriends = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

会员类:

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;
    }


}
Run Code Online (Sandbox Code Playgroud)

用于朋友的ArrayList包含所有用户朋友.我只想删除好友列表,小组成员如果出现:

mFriends.removeAll(mGroupMembers);
Run Code Online (Sandbox Code Playgroud)

但它没有对mFriends清单做任何事......

查看日志语句,朋友确实出现在mGroupMember列表中.

为什么这不起作用?

Kev*_*lia 18

如何确定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());
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,当您覆盖.equals它时,建议也覆盖它,hashCode以便对象也可以在散列函数中正常工作,如SetMap.


Yas*_*jaj 6

你必须知道

ArrayList#removeAll(Collection)

打电话给

ArrayList#contains(Object)

打电话给

ArrayList#indexOf(Object)

最后打电话给

Object#equals


因此,如果equals未正确覆盖(遵循equals合同规则),则无法获得正确的行为.