HashMap具有错误的equals和HashCode实现

Dripto

根据我的读物,

要使用对象作为hashMap的键,它必须提供对equalshashCode方法的正确覆盖和实现HashMap的get(Key k)方法调用键对象上的hashCode方法,并将返回的hashValue应用于其自己的静态哈希函数,以查找存储区位置(支持数组),在该存储区中,键和值以称为Entry(Map)的嵌套类的形式存储。入口)。HashMap的内部哈希方法可以防御质量差的哈希函数。

为了测试这些合同,我编写了一个bean类,其中带有equalshashCode方法的错误但合法的实现

班级:

public class HashVO {

    private String studentName;
    private int age;
    private boolean isAdult;

    public HashVO(String studentName, int age, boolean isAdult) {
        super();
        this.studentName = studentName;
        this.age = age;
        this.isAdult = isAdult;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isAdult() {
        return isAdult;
    }
    public void setAdult(boolean isAdult) {
        this.isAdult = isAdult;
    }
    @Override
    public String toString() {
        return studentName + " : " + age + " : " + isAdult;
    }
    @Override
    public boolean equals(Object obj) {
        return false;
    }
    @Override
    public int hashCode() {
        return 31;
    }

}

在这种情况下,HashMap的hash方法

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

每次也应该返回相同的值,因为哈希码总是返回31。因此,如果将HashVO类的对象用作hashMap的键,则get方法将不起作用,因为它应转到同一存储桶以检索对象和equals方法总是返回false,因此它不能找到匹配的关键对象

但是当我使用这种方法时

public static void main(String[] args) {
        HashMap<HashVO, String> voMap = new HashMap<HashVO, String>();
        HashVO vo = new HashVO("Item1", 25, true);
        HashVO vo1 = new HashVO("Item2", 12, false);
        HashVO vo2 = new HashVO("Item3", 1, false);
        voMap.put(vo, "Item");
        voMap.put(vo1, "Item1");
        voMap.put(vo2, "Item2");
        System.out.println(voMap.get(vo));
        System.out.println(voMap.get(vo1));
        System.out.println(voMap.get(vo2));
    }

输出正确,并显示

Item
Item1
Item2

我想了解为什么即使Equals和HashCode方法实现不正确,也会出现此正确输出。

Sotirios Delimanolis

HashMap有一个小技巧,可以在使用之前比较对象引用equals由于您使用相同的对象引用来添加元素和检索元素,因此HashMap将正确返回它们。

在此处查看Java 7的源代码(Java 8做了很大的改进,HashMap但它做了类似的事情)

final Entry<K,V> getEntry(Object key) {
    if (size == 0) {
        return null;
    }

    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        // HERE. Uses == with the key
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k)))) 
            return e;
    }
    return null;
}

请注意,这不是文档的一部分,因此请不要依赖它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HashMap具有错误的equals和HashCode实现

来自分类Dev

覆盖等于和hashCode如何影响具有错误哈希功能的Java中将数据存储在Map中?

来自分类Dev

当Typescript类实现具有错误签名的接口方法时,没有错误

来自分类Dev

为BST实现equals和hashcode

来自分类Dev

hashCode和equals在int [] Java中的实现

来自分类Dev

根据equals和hashcode实现compareTo

来自分类Dev

hashCode和equals在int [] Java中的实现

来自分类Dev

pdfbox和itext提取具有错误dpi的图像

来自分类Dev

即使通过hashCode()和equals()也不能覆盖Hashmap元素?

来自分类Dev

虽然hashCode()和equals()方法是真实的HashMap的containsKey()返回false

来自分类Dev

即使通过hashCode()和equals()也不能覆盖Hashmap元素?

来自分类Dev

尽管实现了hashCode()和equals(),HashSet仍添加重复项

来自分类Dev

为什么UserRole实现Serializable并覆盖equals()和hashcode()方法

来自分类Dev

在Java中为我的对象实现Equals和hashCode

来自分类Dev

在重写对象之后使用Object的hashCode()和equals()实现

来自分类Dev

如果类具有引用类型成员java,如何实现equality和hashCode方法?

来自分类Dev

directoryIterator具有错误的“起点”

来自分类Dev

具有错误余量的MKA注释

来自分类Dev

没有hashCode()的equals()

来自分类Dev

排序和过滤后的项目具有错误的$ index值

来自分类Dev

具有错误的镜面反射分量的法线贴图和phong着色

来自分类Dev

使用Mocha和Chai为具有错误的功能编写测试用例

来自分类Dev

使用Mocha和Chai为具有错误的功能编写测试用例

来自分类Dev

在实模式下结合 NASM、BCC 和 Ld86:具有错误的幻数

来自分类Dev

没有覆盖的hashCode()和equals()的对象上的LinkedHashSet

来自分类Dev

Intellij具有错误的Scala语法错误

来自分类Dev

具有错误类的FactoryBot ActiveRecord :: AssociationTypeMismatch错误

来自分类Dev

实现一个没有错误的接口

来自分类Dev

Java HashMap返回值未根据我对equals和hashcode的理解进行确认

Related 相关文章

  1. 1

    HashMap具有错误的equals和HashCode实现

  2. 2

    覆盖等于和hashCode如何影响具有错误哈希功能的Java中将数据存储在Map中?

  3. 3

    当Typescript类实现具有错误签名的接口方法时,没有错误

  4. 4

    为BST实现equals和hashcode

  5. 5

    hashCode和equals在int [] Java中的实现

  6. 6

    根据equals和hashcode实现compareTo

  7. 7

    hashCode和equals在int [] Java中的实现

  8. 8

    pdfbox和itext提取具有错误dpi的图像

  9. 9

    即使通过hashCode()和equals()也不能覆盖Hashmap元素?

  10. 10

    虽然hashCode()和equals()方法是真实的HashMap的containsKey()返回false

  11. 11

    即使通过hashCode()和equals()也不能覆盖Hashmap元素?

  12. 12

    尽管实现了hashCode()和equals(),HashSet仍添加重复项

  13. 13

    为什么UserRole实现Serializable并覆盖equals()和hashcode()方法

  14. 14

    在Java中为我的对象实现Equals和hashCode

  15. 15

    在重写对象之后使用Object的hashCode()和equals()实现

  16. 16

    如果类具有引用类型成员java,如何实现equality和hashCode方法?

  17. 17

    directoryIterator具有错误的“起点”

  18. 18

    具有错误余量的MKA注释

  19. 19

    没有hashCode()的equals()

  20. 20

    排序和过滤后的项目具有错误的$ index值

  21. 21

    具有错误的镜面反射分量的法线贴图和phong着色

  22. 22

    使用Mocha和Chai为具有错误的功能编写测试用例

  23. 23

    使用Mocha和Chai为具有错误的功能编写测试用例

  24. 24

    在实模式下结合 NASM、BCC 和 Ld86:具有错误的幻数

  25. 25

    没有覆盖的hashCode()和equals()的对象上的LinkedHashSet

  26. 26

    Intellij具有错误的Scala语法错误

  27. 27

    具有错误类的FactoryBot ActiveRecord :: AssociationTypeMismatch错误

  28. 28

    实现一个没有错误的接口

  29. 29

    Java HashMap返回值未根据我对equals和hashcode的理解进行确认

热门标签

归档