zoukankan      html  css  js  c++  java
  • java中hashmap的实现原理

    HashMap底层是一个数组,通过允许冲突来实现大小可扩充。数组的下标是对象的散列码,存储的是list,查询list的时候是线性equals()比较(所以速度的瓶颈在于不能让list过长,也就是数据不能太集中)。

    放入HashMap的对象要实现2个方法,hashCode()和equals()。

    equals()正确的实现必须满足5个条件:

    1、自反性:x.equals(x)必为true

    2、对称性:x.equals(y)等于y.equals(x)

    3、传递性:若x.equals(y)为true,且y.equals(z)为true,必有x.equals(z)为true

    4、一致性:x.equals(y)的值不会因为调用次数的改变而改变

    5、x不是null时,x.equals(null)比为false

    hashCode()的编写:

    1、hashCode()不应依赖于易变的数据,同一个对象调用hashCode()返回的值必须相等

    2、不应使用this,此时put()和get()产生的hashCode()也不相同

    3、对于hashCode()来说,应该更关注生成速度而不是唯一性,它是允许冲突的

    4、应该要分布均匀

    如何编写好的散列码已经有了较好的指导:

    1、初始化结果int hashcode=17

    2、添加每一个域,如有两个成员String name;和int id;,则

    hashcode=hashcode*37+name的哈希码;

    hashcode=hashcode*37+id的哈希码;

    至于域的哈希码如何计算,详情见《java编程思想》496(溜了

  • 相关阅读:
    查找算法之——符号表(引入篇)
    排序算法之——优先队列经典实现(基于二叉堆)
    C# Timer和多线程编程、委托、异步、Func/Action
    Tomcat汇总-部署多个项目(不同端口)
    数据库汇总(MySQL教材)
    基础知识
    常用工具&网址
    Phython开发
    单元测试
    软件项目过程和文档
  • 原文地址:https://www.cnblogs.com/towerbird/p/11575361.html
Copyright © 2011-2022 走看看