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

  • 相关阅读:
    Diffie–Hellman key exchange
    VMware虚拟机VMware Authorization Service不能启动问题
    深入理解PHP内核(十)变量及数据类型-类型提示的实现
    深入理解PHP内核(九)变量及数据类型-静态变量
    深入理解PHP内核(八)变量及数据类型-预定义变量
    深入理解PHP内核(七)变量及数据类型-常量
    深入理解PHP内核(六)哈希表以及PHP的哈希表实现
    深入理解PHP内核(五)变量及数据类型-变量的结构和类型
    汇编程序的Hello world
    Spring(一)第一个示例
  • 原文地址:https://www.cnblogs.com/chengpeng15/p/5804441.html
Copyright © 2020-2023  润新知