java对象的内存地址与hashcode值关系

 

        为了比较java对象的内存地址与hashcode的关系,必须想办法获取这两个值

         Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,具体下看的代码

 

package com.test.democlass;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * Created by 15002 on 2020/5/19.
 */
public class AddresserTest {
        private static Unsafe unsafe;
        static {
            try {
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (Unsafe) field.get(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public static long addressOf(Object o) throws Exception {
            Object[] array = new Object[] { o };
            long baseOffset = unsafe.arrayBaseOffset(Object[].class);
            //arrayBaseOffset方法是一个本地方法,可以获取数组第一个元素的偏移地址
            int addressSize = unsafe.addressSize();
            long objectAddress;
            switch (addressSize) {
                case 4:
                    objectAddress = unsafe.getInt(array, baseOffset);
                    //getInt方法获取对象中offset偏移地址对应的int型field的值
                    break;
                case 8:
                    objectAddress = unsafe.getLong(array, baseOffset);
                    //getLong方法获取对象中offset偏移地址对应的long型field的值
                    break;
                default:
                    throw new Error("unsupported address size: " + addressSize);
            }
            return (objectAddress);
        }

        public static void main(String... args) throws Exception {
            String str ="Hello world";
            Object mine = str.toCharArray(); //先把字符串转化为数组对象
            long address = addressOf(mine);
            System.out.println("str的内存地址: " + address);
            System.out.println("str的hashcode: " + str.hashCode());
            // Verify address works - should see the characters in the array in the output
            printBytes(address, 27);
        }

        public static void printBytes(long objectAddress, int num) {
            for (long i = 0; i < num; i++) {
                int cur = unsafe.getByte(objectAddress + i);
                System.out.print((char) cur);
            }
            System.out.println();
        }
    }

运行结果

str的内存地址: 3804983656
str的hashcode: -832992604

所以内存地与hashcode完全不同

 

 

已标记关键词 清除标记
相关推荐
<p> <span style="color:#666666;font-size:14px;background-color:#FFFFFF;">【讲师介绍】<br />       现某知名大型互联网公司资深架构师,技术总监,职业规划师,面试官,曾在某上市培训机构,高校任教多年。<br />     Array老师 10多年互联网公司实战经验,知名的大型互联网公司的架构师,高管等职,在企业长期从事于技术的源码阅读和新技术的研究;从事面试官多年 。<br /> 技术选型<br /> 开发环境:Eclipse/Idea ,JDK 1.8及其以上 <br /> 后端技术<br /> 核心框架:SpringBoot2.x框架系列(同样适用Springcloud F版本以后的版本),如下(节选):    <br /> 持久层框架:RestHighLevelClient(官方推荐)<br /> 工具类:Apache Commons、Jackson 、fastjson、Gson<br /> 有四种不同的方式来产生JSON格式的文档(document)<br /> 手动方式,使用原生的byte[]或者String<br /> 使用Map方式,会自动转换成与之等价的JSON<br /> 使用第三方库来生成序列化beans,如JackJSON、FastJSON等<br /> 使用内置的帮助类XContentFactory.jsonBuilder()<br /> <br /> 前端技术  :<br /> ElasticSearch-head插件(NodeJs版本)<br /> 课程内容:<br /> springboot2.1.8+Es7.3.2的完美结合,让大数据PB级别的数据查询,瞬间展示和释放生产力;<br /> Es7.x(elasticsearch7.x)目前最新官方版本的集群搭建 <br /> 绚丽的可视化工具结合展示 <br /> 中文分词器让你搜索无忧,一次搞定新技术<br /> </span> </p> <p> <br /> </p> <p> 课程截图 </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201909260449249479.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909260449426487.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909260453327299.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909260454128125.png" alt="" /><img src="https://img-bss.csdn.net/201909260454259302.png" alt="" /><img src="https://img-bss.csdn.net/201909260454323952.png" alt="" /><img src="https://img-bss.csdn.net/201909260454395056.png" alt="" /><img src="https://img-bss.csdn.net/201909260454473650.png" alt="" /><img src="https://img-bss.csdn.net/201909260454584201.png" alt="" /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页