数组列表删除全部() 不删除对象

2022-09-05 00:27:48

我有成员类的简单 ArrayLists:

ArrayList<Member> mGroupMembers = new ArrayList<>();
ArrayList<Member> mFriends = new ArrayList<>();

会员类:

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

为什么这不起作用?


答案 1

如何确定 2 个成员相等?我猜如果它们具有相同的ID,您认为它们是相等的,但是java希望它们在内存中是完全相同的引用,但事实可能并非如此。要更正此问题,您可以覆盖该函数,以便在 id 相等时将其返回:equals

public class Member {
    //..

    @Override
    public boolean equals(Object anObject) {
        if (!(anObject instanceof Member)) {
            return false;
        }
        Member otherMember = (Member)anObject;
        return otherMember.getUserUID().equals(getUserUID());
    }
}

此外,在重写时,建议也进行重写,以便对象在哈希函数(如 或 )中也能正常工作。.equalshashCodeSetMap


答案 2

你必须知道

ArrayList#removeAll(Collection)

拨打电话

ArrayList#contains(Object)

它调用

ArrayList#indexOf(Object)

最后调用

Object#equals


因此,如果未正确覆盖(遵循相等合约规则),则不会获得正确的行为。equals


推荐