java的int类型修改会导致内存地址发生变化

为什么修改java的int类型的变量的值,它的内存地址会变?不是说是在原来分配的内存里面修改值吗?
请帮忙解答一下疑惑!

img

代码:
package com.example.demo1;

public class ParamTest {

public static void main(String[] args) {
    ParamTest pt = new ParamTest();
    int num = 9;
    System.out.println("变量num的内存地址1:"+System.identityHashCode(num));

    num = 10;
    System.out.println("变量num的内存地址2:"+System.identityHashCode(num));

    num = 11;
    System.out.println("变量num的内存地址3:"+System.identityHashCode(num));
}

}

identityHashCode()方法用于返回给定对象的哈希码,并不是真正意义上的内存地址

【以下回答由 GPT 生成】

这个现象是由于Java中的装箱和拆箱机制引起的。

在Java中,int是一个基本数据类型,它在内存中直接存储数值,而不是作为一个对象来存储。当你声明一个int变量时,Java直接在栈内存中为它分配内存空间。

当你使用System.identityHashCode()方法获取一个基本数据类型的内存地址时,Java会自动将其装箱为一个Integer对象,然后再调用Integer对象的hashCode()方法来获取内存地址。

在你的代码中,当你对num变量赋予新的值时,Java会创建一个新的Integer对象来存储新的值。由于每个Integer对象都有自己的内存地址,所以当你通过System.identityHashCode()方法获取地址时会看到不同的结果。

下面是一个示例代码,用于说明这个现象:

public class ParamTest {

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
        Integer num = 9;
        System.out.println("变量num的内存地址1: " + System.identityHashCode(num));

        num = 10;
        System.out.println("变量num的内存地址2: " + System.identityHashCode(num));

        num = 11;
        System.out.println("变量num的内存地址3: " + System.identityHashCode(num));

        // 使用valueOf()方法将int类型的值装箱为Integer对象
        Integer num2 = Integer.valueOf(9);
        System.out.println("变量num2的内存地址1: " + System.identityHashCode(num2));

        num2 = Integer.valueOf(10);
        System.out.println("变量num2的内存地址2: " + System.identityHashCode(num2));

        num2 = Integer.valueOf(11);
        System.out.println("变量num2的内存地址3: " + System.identityHashCode(num2));
    }
}

这里,我们将num变量的类型从int改为Integer。因为Integer是一个对象类型,赋值时会发生自动装箱,将int值转换为Integer对象。这样,当我们使用System.identityHashCode()时,实际上是获取到了Integer对象的内存地址。

你会发现,当使用Integer对象时,每次对num变量赋值时,Java并不会为其创建新的对象,而是通过Integer.valueOf()方法来重用已有的对象。这就是为什么你会发现num2的内存地址相同。

所以,小结一下: - 基本数据类型的变量直接存储数值,System.identityHashCode()获取的是数值在栈内存中的地址。 - 对象类型的变量存储对象的引用,System.identityHashCode()获取的是对象在堆内存中的地址。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^