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

原文地址:https://www.cnblogs.com/chengpeng15/p/5804441.html