iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java Object的hashCode方法怎么使用
  • 574
分享到

java Object的hashCode方法怎么使用

2023-06-22 04:06:37 574人浏览 独家记忆
摘要

这篇文章主要讲解了“java Object的hashCode方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java Object的hashCode方法怎么使用

这篇文章主要讲解了“java Object的hashCode方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java Object的hashCode方法怎么使用”吧!

    1. 背景介绍

    在为重写hashCode方法的时候,看到hashCode打印出的数据像是一个地址值,很是好奇。

    加之最近在研读JVM源码,特此一探究竟,看看在hotspot中hashCode究竟是如何实现的。

    2. 调用过程梳理

    java的Object代码

    public native int hashCode();

    通过官产jdk的Object.class的源码, 发现hashCode被native修饰. 因此这个方法应该是在jvm中通过C/C++实现

    jvm的hashCode相关代码

    首先观察Object.java对应的Object.c代码

    // 文件路径: jdk\src\share\native\java\lang\Object.cstatic JNINativeMethod methods[] = {    {"hashCode",    "()I",                    (void *)&JVM_IHashCode}, // 这个方法就是我们想看的hashCode方法    {"wait",        "(J)V",                   (void *)&JVM_MonitorWait},    {"notify",      "()V",                    (void *)&JVM_MonitorNotify},    {"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},    {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},};

    进一步进入到jvm.h文件中, 这个文件中包含了很多java调用native方法的接口

    // hotspot\src\share\vm\prims\jvm.hJNIEXPORT jint JNICALLJVM_IHashCode(JNIEnv *env, jobject obj); // 此时定了已hashCode方法的接口, 具体实现在jvm.cpp中
    // hotspot\src\share\vm\prims\jvm.cpp// java.lang.Object ///JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))  JVMWrapper("JVM_IHashCode");  // as implemented in the classic virtual Machine; return 0 if object is NULL  return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ; // 如果object为null, 就返回0; 否则就调用ObjectSynchronizer::FastHashCodeJVM_END

    进入到ObjectSynchronizer::FastHashCode

    // hotspot\src\share\vm\runtime\synchronizer.cppintptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {// .... // 在FastHashCode方法中有一段关键代码: if (mark->is_neutral()) {     hash = mark->hash();              // 首先通过对象的markWord中取出hashCode     if (hash) {                       // 如果取调到了, 就直接返回       return hash;     }     hash = get_next_hash(Self, obj);  // 如果markword中没有设置hashCode, 则调用get_next_hash生成hashCode     temp = mark->copy_set_hash(hash); // 生成的hashCode设置到markword中     // use (machine word version) atomic operation to install the hash     test = (markOop) Atomic::cmpxchg_ptr(temp, obj->mark_addr(), mark);     if (test == mark) {       return hash;     } }// ....}

    生成hashCode的方法get_next_hash, 可以支持通过参数配置不同的生成hashCode策略

    // hotspot\src\share\vm\runtime\synchronizer.cppstatic inline intptr_t get_next_hash(Thread * Self, oop obj) {  intptr_t value = 0 ;  // 一共支持6中生成hashCode策略, 默认策略值是5  if (hashCode == 0) {  // 策略1: 直接通过随机数生成     value = os::random() ;  } else if (hashCode == 1) {     // 策略2: 通过object地址和随机数运算生成     intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ;     value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;  } else if (hashCode == 2) {  // 策略3: 永远返回1, 用于测试     value = 1 ;            // for sensitivity testing  } else if (hashCode == 3) {  // 策略4: 返回一个全局递增的序列数     value = ++GVars.hcSequence ;  } else if (hashCode == 4) {  // 策略5: 直接采用object的地址值     value = cast_from_oop<intptr_t>(obj) ;  } else {     // 策略6: 通过在每个线程中的四个变量: _hashStateX, _hashStateY, _hashStateZ, _hashStateW     // 组合运算出hashCode值, 根据计算结果同步修改这个四个值     unsigned t = Self->_hashStateX ;     t ^= (t << 11) ;     Self->_hashStateX = Self->_hashStateY ;     Self->_hashStateY = Self->_hashStateZ ;     Self->_hashStateZ = Self->_hashStateW ;     unsigned v = Self->_hashStateW ;     v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;     Self->_hashStateW = v ;     value = v ;  }  value &= markOopDesc::hash_mask; // 通过hashCode的mask获得最终的hashCode值  if (value == 0) value = 0xBAD ;  assert (value != markOopDesc::no_hash, "invariant") ;  TEVENT (hashCode: GENERATE) ;  return value;}

    3. 关于hashCode值的大小

    前面以及提交到hashCode生成后, 是存储在markword中, 我们在深入看一下这个markword

    // hotspot\src\share\vm\oops\markOop.hppclass markOopDesc: public oopDesc { private:  // Conversion  uintptr_t value() const { return (uintptr_t) this; } public:  // Constants  enum { age_bits                 = 4,         lock_bits                = 2,         biased_lock_bits         = 1,         max_hash_bits            = BitsPerWord - age_bits - lock_bits - biased_lock_bits,         hash_bits                = max_hash_bits > 31 ? 31 : max_hash_bits, // 通过这个定义可知, hashcode可占用31位bit. 在32位jvm中,  hashCode占用25位         cms_bits                 = LP64_ONLY(1) NOT_LP64(0),         epoch_bits               = 2  };  }

    4. 验证

    package test;public class TestHashCode {    public static void main(String[] args) {        Object obj1 = new Object();        Object obj2 = new Object();        System.out.println(obj1.hashCode());        System.out.println(obj2.hashCode());    }}

    通过-XX:hashCode=2这种形式, 可以验证上述的5中hashCode生成策略

    5. 总结

    在64位jvm中, hashCode最大占用31个bit; 32位jvm中, hashCode最大占用25个bit

    hashCode一共有六种生成策略

    序号hashCode策略值描述
    10直接通过随机数生成
    21通过object地址和随机数运算生成
    32永远返回1, 用于测试
    43返回一个全局递增的序列数
    54直接采用object的地址值
    6其他通过在每个线程中的四个变量: _hashStateX, _hashStateY, _hashStateZ, _hashStateW 组合运算出hashCode值, 根据计算结果后修改这个四个值

    默认策略采用策略6, 在globals.hpp文件中定义

      product(intx, hashCode, 5,                                                \          "(Unstable) select hashCode generation alGorithm")

    感谢各位的阅读,以上就是“java Object的hashCode方法怎么使用”的内容了,经过本文的学习后,相信大家对java Object的hashCode方法怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: java Object的hashCode方法怎么使用

    本文链接: https://www.lsjlt.com/news/302474.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • java Object的hashCode方法怎么使用
      这篇文章主要讲解了“java Object的hashCode方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java Object的hashCode方法怎么使用...
      99+
      2023-06-22
    • java Object的hashCode方法的计算逻辑分析
      目录1. 背景介绍2. 调用过程梳理java的Object代码jvm的hashCode相关代码3. 关于hashCode值的大小4. 验证5. 总结1. 背景介绍 在为重写hashC...
      99+
      2024-04-02
    • Java中hashCode方法怎么用
      这篇文章主要介绍“Java中hashCode方法怎么用”,在日常操作中,相信很多人在Java中hashCode方法怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中hashCode方法怎么用”的疑...
      99+
      2023-06-29
    • Java中List.contains(Object object)方法怎么使用
      本篇内容主要讲解“Java中List.contains(Object object)方法怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中List.contains(Ob...
      99+
      2023-06-29
    • Java中List.contains(Object object)方法使用
      使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地址不同的情况),如果没有重写List<...
      99+
      2024-04-02
    • Java中 hashcode方法的作用是什么
      这期内容当中小编将会给大家带来有关Java中 hashcode方法的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android...
      99+
      2023-06-14
    • Java中Object类的方法怎么用
      这篇文章主要介绍了Java中Object类的方法怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中Object类的方法怎么用文章都会有所收获,下面我们一起来看看吧。前言:Java的Object 类的...
      99+
      2023-06-30
    • HashSet/TreeSet是怎么使用hashCode()和equal()方法的
      本篇内容主要讲解“HashSet/TreeSet是怎么使用hashCode()和equal()方法的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HashSet/TreeSet是怎么使用hash...
      99+
      2023-06-03
    • 如何Java中的hashCode()方法
      本篇内容主要讲解“如何Java中的hashCode()方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何Java中的hashCode()方法”吧!Object 类中就包含了 hashCode...
      99+
      2023-06-15
    • hashcode方法如何在Java项目中使用
      这篇文章给大家介绍hashcode方法如何在Java项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Obje...
      99+
      2023-05-30
      java hashcode
    • Java Object类equals方法怎么用
      这篇文章主要介绍“Java Object类equals方法怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Object类equals方法怎么用”文章能帮助大家解决问...
      99+
      2023-06-30
    • java中的Object类的toSpring()方法怎么用
      这篇文章主要讲解了“java中的Object类的toSpring()方法怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中的Object类的toSpring()方法怎么用”吧!O...
      99+
      2023-06-30
    • Java 中Object的wait() notify() notifyAll()方法使用
      Java 中Object的wait() notify() notifyAll()方法使用一、前言  对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多。二、线程安全基本...
      99+
      2023-05-31
      java object wait()
    • Java Object类怎么使用
      这篇文章主要介绍“Java Object类怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Object类怎么使用”文章能帮助大家解决问题。1.equals方法==...
      99+
      2023-07-02
    • 怎么重写及应用equals()方法和hashCode()方法
      这篇文章主要介绍“怎么重写及应用equals()方法和hashCode()方法”,在日常操作中,相信很多人在怎么重写及应用equals()方法和hashCode()方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
      99+
      2023-07-05
    • Java深入讲解Object类常用方法的使用
      目录1.Object类的常用方法2.equals()方法3.toString方法4.getClass方法5.对象运算符instanceof实例Java代码java继承 1.Objec...
      99+
      2024-04-02
    • object方法如何在java项目中使用
      这篇文章将为大家详细讲解有关object方法如何在java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正则: “.”和"\""."点儿,在...
      99+
      2023-05-31
      java object ava
    • 怎么解决使用Hashcode中distinct()方法没有起效问题
      本篇内容介绍了“怎么解决使用Hashcode中distinct()方法没有起效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
      99+
      2024-04-02
    • Python中object类特殊方法怎么使用
      这篇“Python中object类特殊方法怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中object类...
      99+
      2023-07-05
    • Object toString方法如何在Java项目中使用
      今天就跟大家聊聊有关Object toString方法如何在Java项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、Object类介绍 Object类在Java...
      99+
      2023-05-31
      object tostring java
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作