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中hashcode_浅谈Java中的Hash值相关推荐

  1. 猿来小课Java视频教程讲师浅谈JAVA体系结构

    猿来小课Java视频教程讲师:Java体系结构中不仅定义了Java的开发编译环境,也定义了Java的运行环境.为运行Java应用程序和applet,计算机上应安装JVM和Java运行时解释器,这两个部 ...

  2. scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

    这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...

  3. java 线程aba,浅谈Java中ABA问题及避免,浅谈javaaba避免

    浅谈Java中ABA问题及避免,浅谈javaaba避免 本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并 ...

  4. java的throw_浅谈Java的throw与throws

    浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...

  5. 【Java虚拟机】浅谈Java虚拟机

    跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...

  6. java 虚拟机_浅谈Java虚拟机内存区

    1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题.为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识.JVM将内存主 ...

  7. java 异步_浅谈Java异步编程

    本文来自网易云社区. Java异步编程引言 Java的异步编程其实是一个充分利用计算机CPU资源,不想让主程序阻塞在某个长时间运行的任务上,这类耗时的任务可以是IO操作.远程调用以及高密度计算任务.如 ...

  8. java 连nosql_浅谈 Java 中 MongoDB NoSQL数据库使用指南

    MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB. 一.引入MongoDB Java Driver包 如果需要操作MongoDB的J ...

  9. java中setattribute_浅谈Java web 中request的setAttribute()用法

    在两个JSP代码片中有这样两端程序: JSP1代码 String [] test=new String[2]; test[0]="1"; test[1]="2" ...

最新文章

  1. Android中Handler的使用
  2. Linux基础7 文件管理类命令
  3. 5.3多线程条件变量
  4. Python爬虫实战(1):爬取糗事百科段子
  5. nyoj-Color the necklace(Ploya定理 + 欧拉函数 + 扩展欧几里得(求逆元))
  6. qml dockwidget窗口停靠
  7. nodejs express use 传值_再也不怕面试官问你express和koa的区别了
  8. android 休眠唤醒驱动流程分析,Android4.0.4休眠唤醒机制分析(基于MSM8260)
  9. 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识
  10. QQ音乐JS逆向爬虫,获取调皮的sign参数,我用python全都爬!
  11. 学生成绩管理系统测试用例C语言,学生成绩管理系统测试用例.docx
  12. 虚拟搭建局域网模拟器_雷电模拟器及夜神模拟器使用局域网连接 IDE 及抓色器...
  13. 让国外买家秒回复的询盘模板合集
  14. 我的面试经历(2013.5)
  15. postman 搭建mock-server
  16. 中字符转换中文乱码的处理方法
  17. Win10通过Anaconda安装GPU版tensorflow
  18. 使用教程--通过Excel模板导入数据到表单
  19. 文本图形处理(扭曲变形、增强等)的源代码列表-2
  20. 【Hardware】【手机震动马达】

热门文章

  1. 2022-2028年中国耐二甲醚橡胶密封材料行业市场全景调研及发展趋势分析报告
  2. python 网络编程之Socket通信案例消息发送与接收
  3. 【Sql Server】DateBase-触发器
  4. 通俗理解tf.nn.conv2d() tf.nn.conv3d( )参数的含义 pytorhc 卷积
  5. linux模拟器 cygwin源
  6. 自然语言处理深度学习篇-BiLSTM文本挖掘实践 命名实体识别
  7. LeetCode简单题之作为子字符串出现在单词中的字符串数目
  8. 最新Spring整合MyBatis详解教程
  9. DLPack构建跨框架的深度学习编译器
  10. 用NVIDIA-NGC对BERT进行训练和微调