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
列表中
为什么这样不行
# 1 楼答案
如何确定两名成员是平等的?我猜如果它们有相同的ID,你会认为它们相等,但是java希望它们在内存中是完全相同的引用,而事实可能并非如此。要纠正这一点,可以重写
equals
函数,使其在ID相等时返回:此外,当您重写
.equals
时,建议也重写hashCode
,以便对象在Set
或Map
等哈希函数中也能正常工作# 2 楼答案
如注释中所述,
ArrayList
中的元素只有在其equals()
方法返回true时才会被删除。非重写方法基于引用检查相等性(即它们必须是内存中的同一对象)您可能希望基于
Member
的属性重写equals
,例如下面的示例:此外,当重写
equals()
时,您应该重写hashCode()
,这样当两个对象相等时,它们具有相同的哈希代码。hashCode的非重写实现也基于引用相等# 3 楼答案
你必须知道
ArrayList#removeAll(Collection)
打电话给
ArrayList#contains(Object)
这就打电话给
ArrayList#indexOf(Object)
这最终会
Object#equals
因此,如果} contract rules ),您就没有得到正确的行为
equals
没有被正确地重写(following the ^{