zoukankan      html  css  js  c++  java
  • Map、Set使用过程中可能出现的问题

    修改了key之后不能remove

    class Student implements Serializable {
            Integer id;
            String name;
    
            public Student(Integer id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public Student() {
            }
    
            //getter,setter....
    
            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                Student student = (Student) o;
                return Objects.equals(getId(), student.getId()) &&
                        Objects.equals(getName(), student.getName());
            }
    
            @Override
            public int hashCode() {
                return Objects.hash(getId(), getName());
            }
        }
            Map<Student,Integer> map=new HashMap<>(4);
            Student stu1=new Student(1,"zs"),stu2=new Student(2,"ls");
            map.put(stu1,1);
            map.put(stu2,2);
            stu1.setName("hhh");
            map.remove(stu1);
            for (Student student : map.keySet()) {
                System.out.println(student);
            }
    

    问题的原因是对key进行了修改(因为key类重写了hashcode和equals方法,所以key对象的hash也会随之改变),由于对象在map中的位置是由修改前的key的hash计算而来的,而删除过程中的查找使用的是修改后的对象的hash,两次hash不一致,因此找不到

  • 相关阅读:
    CF703D Mishka and Interesting sum
    CF697D Puzzles
    SCOI2017酱油记
    [BZOJ4730][清华集训2016][UOJ266] Alice和Bob又在玩游戏
    BZOJ4311:向量
    BZOJ4520: [Cqoi2016]K远点对
    BZOJ4555: [Tjoi2016&Heoi2016]求和
    [Codechef November Challenge 2012] Arithmetic Progressions
    agc040
    补题
  • 原文地址:https://www.cnblogs.com/darknessplus/p/10356701.html
Copyright © 2011-2022 走看看