EffectiveJava之HashCode学习笔记

2024-06-08 01:18

本文主要是介绍EffectiveJava之HashCode学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HashCode 生成方法

Step1.int result=任意整数(奇素数如31);

Step2.

计算hashcode

int类型计算方法:

result = 31 * result + int类型的数值

对于boolean类型计算方法:

result = 31 * result + (b?1:0) //b为boolean类型数值

对于byte/char/short/int/类型计算方法:

result = 31 * result + (int)f //f为byte/char/short/int/类型数值

对于long类型计算方法:

result = 31 * result + (int)(f^(f>>>32))//long类型的数值

对于float类型计算方法:

result = 31 * result + Float.floatToIntBits(f)

对于double类型计算方法:

result = 31 * result + (int)(Double.doubleToLongBits(f)^(Double.doubleToLongBits(f)>>>32))

如果该域是一个对象引用则用equals方法比较这个域,调用hashcode如果这个域为null则返回0

如果该域是一个数组则把每个元素作为单独的域处理然后将每个域的hashcode相加起来

如果一个域的值可以由其他域计算出来 则可以将这样的域排除在外 

Equals比较计算中没有用到的域必须排除在外

 

如果一个类是不可变的 并且计算散列码的开销也比较大 则可将其散列码缓存在对象内部而不是每次请求都重新计算其散列码 如果该对象会被用作散列键 则一开始创建实例时就应该计算其散列码 否则可以选择延迟初始化散列码 当其hashcode第一次调用时在进行初始化

eg://延迟初始化

private volatile int hashCode;

 

@Override

public int hashCode(){

    int result = hashCode;

    if( result == 0 ){

        result = 31;

        result = 31 * result + areaCode;

        result = 31 * result + prefix;

        hashCode = result;

    }

    return result;

}

// volatile 说明:用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的

 

 

这篇关于EffectiveJava之HashCode学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040836

相关文章

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例