覆写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. WCF学习笔记(二):在WCF中使用集合传输数据
  2. 《神探tcpdump第一招》-linux命令五分钟系列之三十五
  3. .ajax跳过不执行,使用ajax跳过路由器登录界面
  4. auot lisp 选择集处理_离散量的计算机处理64_1Cvs
  5. scala 加载与保存xml文档
  6. 你是不是在混日子,看着一点就知道了
  7. spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle
  8. 了解机器学习框架CoreML
  9. 【GitHub】提交新项目、更新已有的项目
  10. IOC容器特性注入第五篇:查找(Attribute)特性注入
  11. 关于电脑桌面图标消失并且右键无法点击的情况
  12. 串口通信USART的波特率误差计算GD32、STM32
  13. Ubuntu 挂载ISO文件
  14. wincc安装信息服务器,常见WinCC安装问题及注意事项
  15. Predicting Lymph Node Metastasis Using Histopathological Images Based on Multiple Instance Learning
  16. Win10怎么设置每天自动开机
  17. 企业以太坊联盟:区块链挑战者
  18. DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
  19. GreenDao笔记
  20. 依锥彻怕燎方跃涣牧叵邻牟辟岗俅

热门文章

  1. 柯洁宣布:明年4月,将再次与围棋AI交锋
  2. 如何将草料二维码收集到的表单信息同步至腾讯文档
  3. c语言编程题输出2012年日历,C++编程,给你一个年份,输出这一年的日历。
  4. 三图并列jquery焦点图代码
  5. .net core 浅克隆和深克隆/浅拷贝和深拷贝
  6. 云开发技术应用python pdf_云开发技术应用python_云开发技术应用(Python)
  7. 2021_On Generating Plausible Counterfactual and Semi-Factual Explanations for Deep Learning
  8. 计算机病毒中英文,计算机网络病毒与防范 中英文.doc
  9. 单片机学习笔记 —— 可变调的蜂鸣器
  10. 物理学在计算机中的物理应用题,「试题研究」中考物理综合应用题的特点