与集合相关的 SCJP 书中的逻辑

logic from SCJP book related to Collections

public class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }
    public int hashCode() {
        return 420;
    }
}

根据上面的程序答案是:

答案:使用 Person 键从 HashMap 中查找值的时间取决于映射的大小。

我没有clue/idea答案怎么和上面一样。我认为这是错误的 hashcode() 方法实现,但唯一的选择如下:

答案:A

如果有人能对此提供一些理解,那就太好了,因为我无法在网上找到任何答案

正常情况下在HashMap中查找一个item,使用hash码来查找该item被放置在哪个"bucket"中。因为hash冲突的可能性(即两个item散列到相同的值),然后使用 .equals().

比较项目

在这种情况下,所有项目都有哈希冲突(因为它们的哈希值都是 420)。

这意味着它需要对地图中的每个项目进行 .equals() 检查,因为它们都在同一个桶中,这意味着找到该项目需要的工作量与地图中的项目数。

HashMap 使用哈希码将条目放入桶中并等于定位它们。 如果所有条目都具有相同的哈希码,那么它们最终都会在同一个桶中。现在,每当您从 map 请求某些内容时,hashmap 将遍历同一存储桶中的所有条目,并在每个条目上调用 equals 以找到您请求的条目。这就是为什么

The time to find the value from HashMap with a Person key depends on the size of the map.

是正确答案

这不是错误的哈希码,而是糟糕的哈希函数。无论对象是什么,它都试图生成相同的哈希键。

由于我们生成了相同的哈希码,因此发生了冲突。冲突解决技术之一是链接。因此,添加到地图中的所有对象都将链接到一个桶中。所以我们需要遍历链来获得正确的对象因此答案