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方法作为演示使用,写的不好。