开发者社区> 问答> 正文

关于hashmap中hashcode的问题

看到一句话:“在使用自定义对象做key的时候,一定要去实现hashcode方法,不然hashmap就成了纯粹的链表,查找性能非常的慢,添加节点元素也非常的慢”
主要不理解这个hashcode是怎么算的呢,如果根据对象地址来算的话,也不会出现上面说的问题

展开
收起
蛮大人123 2016-03-04 17:08:28 1900 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    java api里的Object.hashcode():

    (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java programming language.)

    看代码可以知道, hashcode()是一个native函数, 但实际JVM会不会直接用对象地址来做hashcode有待探讨, 因为现代的JVM 堆都是分代管理的, 一个Object很可能在一次 GC后改变其对象地址.而对一个对象来说, 其生命周期内的hashcode是不会变的.

    Effective Java里提到自定义hashcode()的recipe(实际上在Eclipse里, 右键-> Source -> Generate hashcode and Equals可以代劳).大概例子这样:

      private String s;
        private int a;
        private short b;
        private Date d;
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + a;
            result = prime * result + b;
            result = prime * result + ((d == null) ? 0 : d.hashCode());
            result = prime * result + ((s == null) ? 0 : s.hashCode());
            return result;
        }
    2019-07-17 18:52:35
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载