1散列的价值在于它的速度:散列使得查询变快,它将键key保存在某处,而我们知道存储一组数组最快的数据结构是数组,所以用它来表示键的信息(注意,数组保存的是键的信息,不是键本身),由于数组是固定的,当我们希望在Map中存放不确定数量的对象时,数组本身不保存键本身,而是通过键生成一个数字,将其作为数组下标,这个下标数字就是散列码,由你自定义的hashCode()散列函数生成;

2为了解决数组容量固定问题,不同的键可以产生相同的下标,也就是可能有冲突,所以说数组多大不重要,任何键总能在数组中找到它的位置。

3 查询一个值的过程就是首先计算散列码,然后使用散列码查询数组(如果数值固定,就可能保证没有散列码冲突,那就有了一个完美的散列函数),通常冲突由外部链接处理:数组并不保存值,而是保存值的list,然后对list中值使用equals()方法进行线性查询,当然最后这部分线性比较匹配会比较慢,但如果散列函数好的话,数组每个位置就只会有较少的值。因此并不是查询整个list,而是根据hashcode散列码跳到某个位置,只对该位置保存的list面很少的元素进行比较。这便是HashMap很快的原因;
下面写一个简单的hashMapDemo简要说明一下怎么使用散列码来快速查到key,解决冲突的:
  1 散列表中槽位,通常称为桶位(bucket),
  2 为了使散列分布均匀,桶的数量通常使用
  3 对于put()方法,hashCode()只对key使用,根据该key计算出的index位置如果是null,表示还没有元素被散列至此,所以要在该位置保存一个对象,就要先new 一个list(如果不为空则就用这个位置现存的list)然后遍历该list,查看是否有相同元素,如果有则替换位新元
  素,如果没有,添加到list末尾;
  4 get()用相同方式计算散列码为index,然后去index位置获取到元素list,遍历list,获取出以key位键的value
      
 
4 hashCode设计要点
 1 hashCode 方法不应该依赖于对象中异变的数据,因为该对象里面的数据一旦变化,hashCode()就会产生不同散列码,相当于产生一个不同键;
   2 也不应该让hashCode()依赖具有唯一性的对象信息;
   3 散列码应该基于对象中有意义的内容;
   4 散列码更应该关注的是速度快,不用太关注独一无二(不同对象的散列码可以相同),只要hashCode()和
      equals()能确认对象身份即可;
   5  生成键的索引前hashCode()值还要做进一步处理,所以散列码生成范围并不重要,int即可;
   6  好的HashCode() 应该能产生分部均匀的散列码
   7 编写合理HashCode()指导方法:
        (1) 给INT 变量的result赋值非0常量
        (2)为对象内每个有意义的域(即每个可以做equals()操作的域)计算出一个int散列码
         

(3)合并计算结果result=37*result+c;

 
 
 
 
 

详解散列hashCode在HashMap中的使用原理的更多相关文章

  1. [ 转载 ]hashCode及HashMap中的hash()函数

    hashCode及HashMap中的hash()函数   一.hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是 ...

  2. hashCode及HashMap中的hash()函数

    一.hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构 ...

  3. 机器学习 | 详解GBDT在分类场景中的应用原理与公式推导

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型. 在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理.GBD ...

  4. JAVA基础4——谈谈HashCode与HashMap相关概念

    谈谈HashCode与HashMap HashCode hashCode,即一个Object的散列码. HashCode的作用: 对于List.数组等集合而言,HashCode用途不大: 对于Hash ...

  5. HashMap中的散列函数、冲突解决机制和rehash

    一.概述 散列算法有两个主要的实现方式:开散列和闭散列,HashMap采用开散列实现. HashMap中,键值对(key-value)在内部是以Entry(HashMap中的静态内部类)实例的方式存储 ...

  6. 【Java入门提高篇】Day23 Java容器类详解(六)HashMap源码分析(中)

    上一篇中对HashMap中的基本内容做了详细的介绍,解析了其中的get和put方法,想必大家对于HashMap也有了更好的认识,本篇将从了算法的角度,来分析HashMap中的那些函数. HashCod ...

  7. 关于hashMap中 计算hashCode的逻辑推理(二)

    hashMap中,为了使元素在数组中尽量均匀的分布,所以使用取模的算法来决定元素的位置.如下: //方法一: static final int hash(Object key){//jdk1.8 in ...

  8. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

    之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...

  9. 如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?

    如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗? ----答案是 可以 原因: 在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了h ...

随机推荐

  1. PYTHON定义函数制作简单登录程序(详细)

    环境:python3.* 结构:   dict_name = {} #定义一个字典,后面用到 def newuser(): #定义注册函数 prompt1='login desired:' while ...

  2. Java基础系列--04_数组

    一维数组: (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每一个元素都有编号,从0开始,最大编号是数组的长度-1. 编号的专业叫法:索引 (3)定义格式 A:数据类型[] 数组名;(一 ...

  3. kerberos环境下flume写hbase

    直接看官网 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hbasesinks a1.channels = c1 ...

  4. 好的RESTful API的设计原则

    转载自一位大佬 英文原版 Principles of good RESTful API Design Good API design is hard! An API represents a cont ...

  5. Spring第一天——入门与IOC

    大致内容 spring基本概念 IOC入门 [17.6.9更新],如何学习spring? 掌握用法 深入理解 不断实践 反复总结 再次深入理解与实践 一.Spring相关概念  1.概述: Sprin ...

  6. 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试

    最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...

  7. Vue — 微信公众号内置h5支付相关

    首先,在公众号后台配置h5页面地址 开发流程 1.通过配置h5地址,获取code.再通过code,获取openid getOpenid(){ let url = 'https://open.weixi ...

  8. 01——Solr学习之全文检索服务系统的基础认识

    一.为什么要用Solr,Solr是个什么东西? 1.1.Solr是个开源的搜索服务器 1.2.我们用Solr主要实现搜索功能,一般的网站首页都会有一个大大的搜索框,用来搜索此网站上的商品啊什么的,如下 ...

  9. centos 7 修改网卡名字

    1.编辑网卡信息 cd /etc/sysconfig/network-scripts/ #进入网卡目录mv ifcfg-en067761 ifcfg-eth0 #重命名网卡 cat ifcfg-eth ...

  10. 查看电脑系统参数(Windows)

    发现工作的电脑开了很多任务,都运行的很好,所以记录下来(以后买电脑可以参考一下) 一.硬件详情(i5第七代?) 硬盘信息(分有固态和机械硬盘): 固态硬盘直接给了系统使用: 二.体验指数(基本都达到了 ...