0

我不明白为什么这段代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        Map<Person, String> map = new HashMap<>();
        Person person = new Person("person");
        map.put(person, "");
        person.name = "person2";  // key's property changed
        System.out.println(map.containsKey(new Person("person")));
        System.out.println(map.containsKey(new Person("person2")));
    }

    static class Person {
        String name;

        Person(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return Objects.equals(name, person.name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(name);
        }

    }
}

打印false false。当我将Person对象放入地图时,应该计算哈希值。然后键的属性被改变。调用containsKey时,应比较哈希值,并new Person("person2")与先前插入的键具有相同的哈希值。在这两种情况下containsKey评估为假会发生什么?

4

0 回答 0