RemoveAll 要重写equals方法
public class User { private String name; private int age; //setter and getter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object obj) { if(name.equals(((User)obj).name)){ return true; }else{ return false; } } }
import java.util.ArrayList; import java.util.List; public class UserList { private List<User> subList; private List<User> allList; public UserList(){ subList=new ArrayList<User>(); allList=new ArrayList<User>(); for(int i=0;i<3;i++){ User user=new User(); user.setAge(i); user.setName("lyh"+i); subList.add(user); } for(int i=0;i<10;i++){ User user=new User(); user.setAge(i); user.setName("lyh"+i); allList.add(user); } } public static void main(String[] args){ UserList userList=new UserList(); userList.allList.removeAll(userList.subList);//调用removeAll方法 System.out.println(userList.allList.size());//要重写equals和hashcode方法 } }
public boolean removeAll(Collection<?> c) { boolean modified = false; Iterator<?> it = iterator(); while (it.hasNext()) { if (c.contains(it.next())) { it.remove(); modified = true; } } return modified; }
public boolean remove(Object o) { Iterator<E> it = iterator(); if (o==null) { while (it.hasNext()) { if (it.next()==null) { it.remove(); return true; } } } else { while (it.hasNext()) { if (o.equals(it.next())) { it.remove(); return true; } } } return false; }
可以看到在调用removeAll方法时,实际上是循环调用了remove方法,而remove方法中有一段关键的代码:
if (o.equals(it.next()))
得出结论:
因为上述例子中的实体类没有Override hashCode和equals方法 !
而在执行removeAll方法时是通过equals方法来判断集合元素是否相等的,如果没有Override equals方法,其默认的仍是比较对象,所以会出现上述问题!
我只是简单的重写的equals方法作为演示使用,写的不好。