有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ArrayList removeAll()不删除对象

我有member类的简单ArrayList:

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列表没有任何作用

查看日志语句,friend实际上出现在mGroupMember列表中

为什么这样不行


共 (3) 个答案

  1. # 1 楼答案

    如何确定两名成员是平等的?我猜如果它们有相同的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等哈希函数中也能正常工作

  2. # 2 楼答案

    如注释中所述,ArrayList中的元素只有在其equals()方法返回true时才会被删除。非重写方法基于引用检查相等性(即它们必须是内存中的同一对象)

    您可能希望基于Member的属性重写equals,例如下面的示例:

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

    此外,当重写equals()时,您应该重写hashCode(),这样当两个对象相等时,它们具有相同的哈希代码。hashCode的非重写实现也基于引用相等

  3. # 3 楼答案

    你必须知道

    ArrayList#removeAll(Collection)

    打电话给

    ArrayList#contains(Object)

    这就打电话给

    ArrayList#indexOf(Object)

    这最终会

    Object#equals


    因此,如果equals没有被正确地重写(following the ^{} contract rules),您就没有得到正确的行为