覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中; 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个

覆写hashcode

1. 把某个非零常数值,例如17,保存在int变量result中;

2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域):

3, boolean型,计算(f? 0 : 1);

4. byte,char,short型,计算(int);

5. long型,计算(int)(f ^ (f>>>32));

6. float型,计算Float.floatToIntBits(afloat);

7. double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];

8. 对象引用,调用对象.hashCode()方法;

9. 对象数组域,对其中每个元素递归调用它的hashCode方法。

10. 基本数组域,对其中每个元素计算,根据类型返回2

11. 将上面计算得到的散列码保存到int变量c,然后执行result=37*result+c;

12. 返回result。

例子:

/****

*

*

* java 八大基本数据类型

*/

private int A_int;

private short A_short;

private char A_char;

private byte A_byte;

private double A_double;

private float A_float;

private boolean A_boolean;

private long A_long;

private Demo demo;// 对象

private int[] intArray;// 数组域

private Demo[] demos;// 对象数组域

@Override

public int hashCode() {

int result=17;

result =31*result+A_int;

result =31*result+(int)A_short;

result =31*result+(int)A_char;

result =31*result+(int)A_byte;

result =31*result+(int)(A_boolean?0:1);

result =31*result+(int)(A_long^(A_long >>> 32));

result=31*result+Float.floatToRawIntBits(A_float);

long tolong = Double.doubleToLongBits(A_double);

result = 31 * result + (int) (tolong ^ (tolong >>> 32));

result =31*result+demo.hashCode();  //object

result =31*result+intArrayHashcode(intArray);//数组域,对其中每个元素调用它的hashCode方法。

result =31*result+DemoArrayHashcode(demos);//对象数组域,递归调用它的hashCode方法

return result;

}

private int intArrayHashcode(int[] intArray) {

int result = 17;

for (int i = 0; i < intArray.length; i++) {//基本类型数组域,,对其中每个元素计算

result = 31 * result + intArray[i];

}

return result;

}

private int DemoArrayHashcode(Demo[] demos) {

int result = 17;

for (int i = 0; i < demos.length; i++) {

result = 31 * result + demos[i].hashCode(); //对象数组域,递归调用它的hashCode方法;

}

return result;

}

当改写equals()的时候,总是要改写hashCode()

根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。

ps:

31是个神奇的数字,因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比乘法的操作效率高的多,对左移现在很多虚拟机里面都有做相关优化,并且31只占用5bits!

本文永久更新链接地址:

java重写hashcode方法代码_Java重写hashcode方法相关推荐

  1. java update()方法代码_Java Datastore.update方法代码示例

    import org.mongodb.morphia.Datastore; //导入方法依赖的package包/类 public static void main(final String[] arg ...

  2. java 静态代码块有什么用,java编程开发静态代码块的使用方法都有哪些

    代码块是程序员在学习java编程开发的时候会接触到的一个代码,而今天我们就通过案例分析来了解一下,java编程开发静态代码块的使用方法都有哪些. (一)java静态代码块静态方法区别 一般情况下,如果 ...

  3. java重写和重载 关键字_Java重写和重载的区别

    一.重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 二.重载(Overload) 重载(overloading) 是 ...

  4. java模糊查询代码_Java模糊查询方法详解

    这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下 当我们需要开发一个方法用来查询数据库的时候,往往会遇到这样一个问题:就是不知 ...

  5. java文本阅读器代码_java项目—文本阅读器

    import java.awt.event.*; import java.io.*; import javax.swing.*; public class ReaderListen implement ...

  6. java实体字节属性定义_Java字节码方法表与属性表详解

    而这些字节其实对应的信息是它: 所以问题就来了,aload_0不是助记符信息么,怎么就能够跟字节码文件中的字节对应上呢?所谓助记符其实也就是帮忙我们去记忆的符合,在底层其实也是对应的一个个十六进制的数 ...

  7. java方法语法_Java基础语法----方法

    1.1 方法概述 在java中,方法就是用来完成解决某件事情或实现某个功能的办法.方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值.我们可以通过在程序代 ...

  8. java抓取网页代码_java 抓取网页内容实现代码

    复制代码 代码如下: package test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

  9. java主窗体设计代码_java窗体设计+GUI经典代码全放送

    [实例简介] java窗体设计经典代码,手把手叫你如何设计java窗体,编写应用程序. [实例截图] [核心代码] 57641e3b-d82c-4f28-bb29-35f951c1158d └── j ...

最新文章

  1. 深度学习100例 | 第51天-目标检测算法(YOLOv5)(入门篇)
  2. JavaScript Bitwise NOT Operator
  3. JS的parseFloat
  4. 修改java启动参数_如何修改jvm启动参数
  5. python复数类型及其特点_二级Python语言程序设计分类模拟4
  6. 选择排序法之Java实现
  7. 自定义View之HenCoder学习笔记
  8. 读取 wav 格式声音文件
  9. 点餐系统数据库设计--SQL Server
  10. ExoPlayer的缓存 四 缓存Cache 的应用
  11. Android近距离通信
  12. matplotlib中cmap_Matplotlib:imshow中cmap的功能是什么?
  13. python CV 趣味项目 答题卡识别
  14. C++的substr()函数
  15. 文本框”输入关键字 “提示
  16. 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
  17. 数据载入、存储及文件格式——《利用python数据分析》第六章学习
  18. 首台android手机,黑莓首台Android系统曲面屏手机Priv 真机和视频曝光
  19. [4G5G专题-29]:物理层-内部架构、功能协议与主要接口概述
  20. python安装pymongo_Python: Windows 7 64位 安装、使用 pymongo 3.2

热门文章

  1. 有限理性模型(转载)
  2. python期末考试试卷及解析
  3. 发那科机器人六轴放大器保险丝熔断_发那科机器人R-30iB控制柜保险丝解析——发那科机器人...
  4. Deblurring via Stochastic Refinement (Paper reading)
  5. Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified
  6. CSAP_MAT_BOM_MAINTAIN修改问题
  7. 企业级微信小程序改名
  8. 基金从业资格考试知识点记录-基金法律法规、职业道德与业务规范
  9. 20210720-springboot项目使用k8s部署,服务启动成功,但是健康检查失败
  10. 《剑指Offer》题解汇总索引表(leetcode)