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方法。


相关文章
|
6月前
|
Java 容器
equals与hashcode的区别与联系
equals与hashcode的区别与联系
|
算法 Java 索引
equals方法和hashCode方法之间的那些事(1.1)
equals方法和hashCode方法之间的那些事(1.1)
|
存储 算法 NoSQL
【Java集合】1 浅析hashCode方法
【Java集合】1 浅析hashCode方法
115 0
【Java集合】1 浅析hashCode方法
|
存储 缓存 Java
深入理解= = 、equals()与hashcode()的关系
理解= = 、equals()与hashcode()的关系
115 0
深入理解= = 、equals()与hashcode()的关系
|
存储 Java 索引
都2022年了,不会还有人hashCode方法都讲解不清楚吧
都2022年了,不会还有人hashCode方法都讲解不清楚吧
|
Oracle Java 关系型数据库
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。
156 0
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
hashCode和equals的区别
hashCode和equals的区别
335 0
|
存储 算法 Java
HashMap中实现原理及hashcode方法
HashMap中实现原理及hashcode方法
266 0
HashMap中实现原理及hashcode方法
|
Java 程序员 容器
如何正确的重写hashcode()
如何正确的重写hashcode()
1698 0
如何正确的重写hashcode()
|
Java 索引
hashCode和equals的区别(一)
Hello,大家好,我是子悠,作为本周的小编我已经不想跟大家介绍自己了,这篇文章让我们跟随 Jay Pan( 哇,一位新作者哦)的步伐学习知识吧。下面是正文。 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!