1、Hash值有什么用?

HashMap、HashTable、HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提高计算的性能。想想看,一般来说,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O(1)的级别。但是添加元素就不这么乐观了。但是使用hash类的集合,添加元素,移动的元素少,只影响一小块,并且查找元素,由于hash值已经进行了定位分组,所以也会大大缩小涉及面,快速定位。

2、Hash值应该符合什么原则?

A、等幂性。不管执行多少次获取Hash值的操作,只要对象不变,那么Hash值是固定的。如果第一次取跟第N次取不一样,那就用起来很麻烦,需要记录当前是第几次操作,这种需要记录状态的事情,可不是什么好事。

B、对等性。若两个对象equal方法返回为true,则其hash值也应该是一样的。举例说明:若你将objA作为key存入HashMap中,然后new了一个objB。在你看来objB和objA是一个东西(因为他们equal),但是使用objB到hashMap中却取不出来东西。

C、互异性。若两个对象equal方法返回为false,则其hash值最好也是不同的,但这个不是必须的,只是这样做会提高hash类操作的性能(碰撞几率低)。

3、Hash值应该怎么计算?

A、简单计算就是组成成员的hash值直接相加即可。比如ObjectA有三个属性,propA、propB和propC,最直接的计算方式就是propA.hashcode+propB.hashcode+propC.hashcode。

B、但是如果遇到有顺序相关的怎么办?比如String类型是由char数组组成,并且这些数组是有顺序的。如果使用第一种计算方法,则“ABCD”和“BCDA”就会产生同样的hashCode,那么怎么办呢?最直接想到的办法就是加权,不同的index加不同的权值,这个权值的确定最直接的方法就是某个常数值的几次幂。比如为String的计算hash值为K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的选择也有说法,最好不要是偶数,因为偶数的相乘会造成信息的丢失(乘以2就是左移1位,一旦溢出就会造成信息的丢失,这种计算会造成溢出后的值与某个看似不相关的数值得到的结果是一样的),所以最好是奇数,在这一点上比较推荐使用7,因为7=8-1=2^3-1,这样计算的时候,直接左移几位再进行一次普通的加减法即可(Java中常用的是31(32-1=2^5-1))。

java中的hash值相关推荐

  1. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  2. Java中的Hash值到底是怎么计算的

    最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...

  3. Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现

    最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String.Integer等类复写了Object中的hashCod ...

  4. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  5. Java中只存在值传递

    2019独角兽企业重金招聘Python工程师标准>>> 在Java中并不存在引用传递(即地址传递),对于变量(可以是基本数据类型,也可以是引用数据类型)而言,可以理解为就是一个地址. ...

  6. java中的返回值到底有什么用?

    今天看到一个有意思的问题:java中的返回值到底有什么用? 看到了一个高赞回答如下: 你是公司的老总,然后你跟你秘书说,我想要两张的电影票.然后,你秘书去排队买票,最后把两张电影票给你,这两张电影票就 ...

  7. Java生成文件hash值

    Java生成文件hash值(通过传入file或者InputStream) package com.hczy.syncdata.common.util;import java.io.File; impo ...

  8. Java中哈希值是怎么算的

    最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...

  9. Java中的Hash Code到底是什么?

    目录 前言 一.Java中的Hashcode是什么? 二.Hash table是什么? 1. 概述 2. hash table的组成 1. Hash function 2. Array 3. 如何处理 ...

最新文章

  1. 单分子实时测序技术的原理与应用
  2. 软件开发过程中的回顾
  3. 唠唠SE的集合-10——Collections工具类
  4. JavaScript之如何对客户端进行检测
  5. Linux系统的启动流程以及做个小小的Linux
  6. 关闭PdfReader右侧工具栏的方法
  7. Xshell通过SSH连接阿里云报错“服务器发送了一个意外的数据包” xshell连接ubuntu
  8. 常见Java面试题 线程和进程的区别?
  9. 【MySQL】深入浅出剖析mysql事务锁机制 - 笔记
  10. EcmaScript对象克隆之谜
  11. 收藏 | 一文读懂深度学习中的各种卷积
  12. es文件浏览器怎么用_谷歌出品的文件管理APP,比ES文件浏览器更简约
  13. shell 强制覆盖文件夹_如何强制robocopy覆盖文件
  14. 施耐德电气技术文档集
  15. Python 通过 Tushare Pro 获取财经数据接口
  16. c语言求圆的周长和面积
  17. 计算机主机启动 显示器不动什么原因,主机开了电脑屏幕不亮怎么回事?电脑开机后显示器不亮的解决方案...
  18. 网络信息安全之基于时间的安全模型(PDR和PPDR模型)
  19. 如何在html网页里获取 mav.addObject(message,登录名或密码错误,请重新输入)的message
  20. 判断素数(质数)高效算法

热门文章

  1. 一些数据格式化-Eval( )和DataBinder.Eval(Container.DataItem, )的区别及用法
  2. 基于Java开发一套完整的区块链系统
  3. Vue2+Vue3的专题目录结构(第二十三课)
  4. 根据起始点经纬度、方向、距离,计算目标点经纬度
  5. js 数组基本知识及常见操作
  6. fedora zend studio 9.0 安装/破解/更换黑暗主题
  7. 阿里CEO逍遥子,为什么要去做客服?
  8. 揭秘——STL空间配置器
  9. can光端机、can转光纤或can光纤转换器功能特点介绍
  10. 技术博客|第9期:Hadoop3升级实践