【面试必问的HashCode技术内幕】tips:面试常问/常用/常出错1) 直接用内存地址?目标:通过一个Demo验证这个hasCode到底是不是内存地址
hashCode到底是什么?是不是对象的内存地址?
public native int hashCode();
com.hashcode.HashCodeTestpackage com.hashcode;import org.openjdk.jol.vm.VM;import JAVA.util.ArrayList;import java.util.List;public class HashCodeTest {//目标:只要发生重复 , 说明hashcode不是内存地址 , 但还需要证明(JVM代码证明)public static void main(String[] args) {List<Integer> integerList = new ArrayList<Integer>();int num = 0;for (int i = 0; i < 150000; i++) {//创建新的对象Object object = new Object();if (integerList.contains(object.hashCode())) {num++;//发生重复(内存地址肯定不会重复)} else {integerList.add(object.hashCode());//没有重复}}System.out.println(num + "个hashcode发生重复");System.out.println("List合计大小" + integerList.size() + "个");}}
15万个循环 , 发生了重复 , 说明hashCode不是内存地址(严格的说 , 肯定不是直接取的内存地址)文章插图
思考一下 , 为什么不能直接用内存地址呢?
- 提示:jvm垃圾收集算法 , 对象迁移……
2) 不是地址那在哪里?既然不是内存地址 , 那一定在某个地方存着 , 那在哪里存着呢?
答案:在对象头里!(画图 。类在jvm内存中的布局)
文章插图
对象头分为两部分 , 一部分是上面指向class描述的地址Klass , 另一部分就是Markword
而我们这里要找的hashcode在Markword里!(标记位意义 , 不用记!)
32位:
文章插图
64位:
文章插图
image.png
3) 什么时候生成的?new的瞬间就有hashcode了吗??
show me the code!我们用代码验证
package com.hashcode;import org.openjdk.jol.info.ClassLayout;import org.openjdk.jol.vm.VM;public class ShowHashCode {public static void main(String[] args) {ShowHashCode a = new ShowHashCode();//jvm的信息System.out.println(VM.current().details());System.out.println("-------------------------");//调用之前打印a对象的头信息//以表格的形式打印对象布局System.out.println(ClassLayout.parseInstance(a).toPrintable());System.out.println("-------------------------");//调用后再打印a对象的hashcode值System.out.println(Integer.toHexString(a.hashCode()));System.out.println(ClassLayout.parseInstance(a).toPrintable());System.out.println("-------------------------");//有线程加重量级锁的时候 , 再来看对象头new Thread(()->{try {synchronized (a){Thread.sleep(5000);}} catch (InterruptedException e) {e.printStackTrace();}}).start();System.out.println(Integer.toHexString(a.hashCode()));System.out.println(ClassLayout.parseInstance(a).toPrintable());}}
结果分析文章插图
文章插图
结论:在你没有调用的时候 , 这个值是空的 , 当第一次调用hashCode方法时 , 会生成 , 加锁以后 , 不知道去哪里了……
推荐阅读
- 护士/护理人员的完整简历范文 护士简历范文
- |职场中有哪些常见的套路?
- |职场上,面子不是所谓的客气,而是让自己有了自信,让自己成功
- 养狗好处vs养狗坏处 养宠物的利弊
- 配音|余生,做一个能扛事的成年人
- 秋作文400字18篇作文 秋天的作文400字
- 翡翠手镯|翡翠手镯的价值,傻瓜教程,教你这样看懂翡翠手镯的色泽
- 短发|爱美的美女看过来,你知道秋天为什么要补水吗?
- 无基础唱歌技巧和发声方式教学 学习唱歌的方法
- 全球变暖的危害有哪些 全球变暖的后果