MapSet使用过程中可能出现的问题

Posted darknessplus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MapSet使用过程中可能出现的问题相关的知识,希望对你有一定的参考价值。

修改了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不一致,因此找不到

以上是关于MapSet使用过程中可能出现的问题的主要内容,如果未能解决你的问题,请参考以下文章

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

Java 求解划分字母区间

如何使列表视图出现在片段中?

JavaScript判断循环MapSet

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误

当 ViewPager 中的片段出现和消失时如何执行一些代码