java重写hashcode方法代码_Java重写hashcode方法
覆写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方法相关推荐
- java update()方法代码_Java Datastore.update方法代码示例
import org.mongodb.morphia.Datastore; //导入方法依赖的package包/类 public static void main(final String[] arg ...
- java 静态代码块有什么用,java编程开发静态代码块的使用方法都有哪些
代码块是程序员在学习java编程开发的时候会接触到的一个代码,而今天我们就通过案例分析来了解一下,java编程开发静态代码块的使用方法都有哪些. (一)java静态代码块静态方法区别 一般情况下,如果 ...
- java重写和重载 关键字_Java重写和重载的区别
一.重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 二.重载(Overload) 重载(overloading) 是 ...
- java模糊查询代码_Java模糊查询方法详解
这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下 当我们需要开发一个方法用来查询数据库的时候,往往会遇到这样一个问题:就是不知 ...
- java文本阅读器代码_java项目—文本阅读器
import java.awt.event.*; import java.io.*; import javax.swing.*; public class ReaderListen implement ...
- java实体字节属性定义_Java字节码方法表与属性表详解
而这些字节其实对应的信息是它: 所以问题就来了,aload_0不是助记符信息么,怎么就能够跟字节码文件中的字节对应上呢?所谓助记符其实也就是帮忙我们去记忆的符合,在底层其实也是对应的一个个十六进制的数 ...
- java方法语法_Java基础语法----方法
1.1 方法概述 在java中,方法就是用来完成解决某件事情或实现某个功能的办法.方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值.我们可以通过在程序代 ...
- java抓取网页代码_java 抓取网页内容实现代码
复制代码 代码如下: package test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- java主窗体设计代码_java窗体设计+GUI经典代码全放送
[实例简介] java窗体设计经典代码,手把手叫你如何设计java窗体,编写应用程序. [实例截图] [核心代码] 57641e3b-d82c-4f28-bb29-35f951c1158d └── j ...
最新文章
- 深度学习100例 | 第51天-目标检测算法(YOLOv5)(入门篇)
- JavaScript Bitwise NOT Operator
- JS的parseFloat
- 修改java启动参数_如何修改jvm启动参数
- python复数类型及其特点_二级Python语言程序设计分类模拟4
- 选择排序法之Java实现
- 自定义View之HenCoder学习笔记
- 读取 wav 格式声音文件
- 点餐系统数据库设计--SQL Server
- ExoPlayer的缓存 四 缓存Cache 的应用
- Android近距离通信
- matplotlib中cmap_Matplotlib:imshow中cmap的功能是什么?
- python CV 趣味项目 答题卡识别
- C++的substr()函数
- 文本框”输入关键字 “提示
- 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
- 数据载入、存储及文件格式——《利用python数据分析》第六章学习
- 首台android手机,黑莓首台Android系统曲面屏手机Priv 真机和视频曝光
- [4G5G专题-29]:物理层-内部架构、功能协议与主要接口概述
- python安装pymongo_Python: Windows 7 64位 安装、使用 pymongo 3.2
热门文章
- 有限理性模型(转载)
- python期末考试试卷及解析
- 发那科机器人六轴放大器保险丝熔断_发那科机器人R-30iB控制柜保险丝解析——发那科机器人...
- Deblurring via Stochastic Refinement (Paper reading)
- Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified
- CSAP_MAT_BOM_MAINTAIN修改问题
- 企业级微信小程序改名
- 基金从业资格考试知识点记录-基金法律法规、职业道德与业务规范
- 20210720-springboot项目使用k8s部署,服务启动成功,但是健康检查失败
- 《剑指Offer》题解汇总索引表(leetcode)