zoukankan      html  css  js  c++  java
  • HashMap中自定义对象key,实现hashcode与equal

    hashmap存储结构

    1、通过对key进行hash函数运算,得到索引,此时的索引与哈希值不一样

    2、哈希值一样,索引一定一样,key不一样一样。哈希值不一样,索引可能一样

    自定义对象的key,为什么要实现hashcode与equals

     

    1、只实现hashcode

    只实现hashcode的话,它们的索引可以得到判定是否一样,但是由于没有实现equal,导致它们的自定义对象key判定不了,判定不了就会采用object中的equal判定。如果它们的key不一样,就会采用链地址法存储key,如果是一样就会覆盖。这样结果就会出现随机,map.size()结果也会随机。但是我们大部分自定义key对象,都需要根据业务要判断key是否是一样,所以同时要实现equal

    2、只实现equal

    可能会导致的结果是,索引不一样,索引也可能一样,那map.size()数量就是随机的,比如上面的例子,p1与p2通过内存地址生成hashcode,计算出来的hashcode可以导致索引一样,也可能导致索引不一样,如果索引一样,那么p1与p2对象就存储在同一个索引地方,然后hashmap还会继续比较自定义对象的key,用equal,如果equal一样,就会p2覆盖p1的key,则上面的例子map.size()是等于2。否则就会采用链地址法,则上面的例子map.size()是等于3

    3、总结

    自定义对象的key,首先通过 :person自定义对象 =====》哈希函数 =====》得到索引======》进行key的equal比较,如果索引与equal相同,则覆盖,如果不同,则链地址法。所以说,一般都会根据自己的业务,同时实现了hashcode与equal,这样Map<object,object>就会根据自己的业务进行存储。

  • 相关阅读:
    CentOS6.5安装Scrapy
    CentOS6.5安装pip
    CentOS6.5 安装openssl
    curl不能支持https问题
    pip安装时遇到的问题集锦,持续更新!
    CentOS6.5安装python3.7
    IntelliJ IDEA 17 本地LicenseServer激活
    omnidb数据库web管理工具安装
    CentOS7安装Kubernetes1.18.1并使用flannel
    Portainer中文汉化
  • 原文地址:https://www.cnblogs.com/caohanren/p/13128466.html
Copyright © 2011-2022 走看看