hashCode和identityHashCode的区别你知道吗?

简介: hashCode关于hashCode参考之前的文章,点击参考之前文章。identityHashCodeidentityHashCode是System里面提供的本地方法,java.lang.System#identityHashCode。

hashCode

关于hashCode参考之前的文章,点击参考之前文章

identityHashCode

identityHashCode是System里面提供的本地方法,java.lang.System#identityHashCode。

/**
 * Returns the same hash code for the given object as
 * would be returned by the default method hashCode(),
 * whether or not the given object's class overrides
 * hashCode().
 * The hash code for the null reference is zero.
 *
 * @param x object for which the hashCode is to be calculated
 * @return  the hashCode
 * @since   JDK1.1
 */
public static native int identityHashCode(Object x);

identityHashCode和hashCode的区别是,identityHashCode会返回对象的hashCode,而不管对象是否重写了hashCode方法。

示例

public static void main(String[] args) {
    String str1 = new String("abc");
    String str2 = new String("abc");
    System.out.println("str1 hashCode: " + str1.hashCode());
    System.out.println("str2 hashCode: " + str2.hashCode());
    System.out.println("str1 identityHashCode: " + System.identityHashCode(str1));
    System.out.println("str2 identityHashCode: " + System.identityHashCode(str2));
    User user = new User("test", 1);
    System.out.println("user hashCode: " + user.hashCode());
    System.out.println("user identityHashCode: " + System.identityHashCode(user));
}

输出结果:

str1 hashCode: 96354
str2 hashCode: 96354
str1 identityHashCode: 1173230247
str2 identityHashCode: 856419764
user hashCode: 621009875
user identityHashCode: 621009875

结果分析:


1、str1和str2的hashCode是相同的,是因为String类重写了hashCode方法,它根据String的值来确定hashCode的值,所以只要值一样,hashCode就会一样。


2、str1和str2的identityHashCode不一样,虽然String重写了hashCode方法,identityHashCode永远返回根据对象物理内存地址产生的hash值,所以每个String对象的物理地址不一样,identityHashCode也会不一样。


3、User对象没重写hashCode方法,所以hashCode和identityHashCode返回的值一样。


结论

hashCode方法可以被重写并返回重写后的值,identityHashCode会返回对象的hash值而不管对象是否重写了hashCode方法。


相关文章
|
监控 Java API
Spring Cloud 2021.0.1 实践 Resilience4J
Spring Cloud CircuitBreaker 提供了跨不同断路器实现的抽象。它提供了在您的应用程序中使用的一致 API,让您(开发人员)选择最适合您的应用程序需求的断路器实现。
2010 0
Spring Cloud 2021.0.1 实践 Resilience4J
|
2月前
|
缓存 监控 算法
淘宝商品详情 API 接入全流程实战指南 (附完整代码)
item_get 是淘宝开放平台提供的核心商品详情查询接口,支持通过商品 ID(num_iid)获取淘宝/天猫商品的完整结构化数据,包括:
|
算法 安全 开发者
优化if-else的11种方案
优化if-else结构的方法多种多样,通过选择合适的方法,可以提高代码的可读性、可维护性和灵活性。本文详细介绍了11种优化if-else的方法,并通过代码示例说明了每种方法的具体应用。希望这些方法能够帮助开发者在实际编程
488 21
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
11月前
|
存储 缓存 分布式数据库
【赵渝强老师】HBase的体系架构
HBase是一种基于BigTable思想的列式存储NoSQL数据库,适合数据分析与处理。其主从架构包含HBase HMaster、Region Server和ZooKeeper。HMaster负责Region分配及表管理;Region Server执行数据读写操作,并包含WAL预写日志、Block Cache读缓存和MemStore写缓存;ZooKeeper维护集群状态并协调分布式系统工作。通过视频讲解与架构图示,详细解析各组件功能与协作机制。
713 11
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
746 2
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
存储 算法 Java
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
ZGC 是 Java 的一种低延迟垃圾回收器,旨在减少 STW 时间,提高对延迟敏感应用的性能。它通过并发和分区收集技术实现这一目标,确保 STW 时长可预测且低至亚毫秒级别。ZGC 使用了着色指针、读屏障、区域化内存管理和压缩迁移等技术。读屏障确保对象在 GC 期间的正确加载,而区域化内存管理则允许高效地分配和释放内存。ZGC 自动调整配置以适应不同应用,且支持大范围的内存大小。通过调整参数如堆大小、GC 线程数、动态 GC 策略等,可以进一步优化延迟。AutoMQ 在使用 ZGC 后,成功将 STW 时间降低到 50 微秒以下,提升了服务性能。
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
|
开发工具 git
git cherry-pick的使用
git cherry-pick的使用
908 0
|
存储 Java
Java细节:浮点数精度丢失问题的原因
Java细节:浮点数精度丢失问题的原因
680 0
Java细节:浮点数精度丢失问题的原因