gpt4 book ai didi

Java内存管理对象与原始类型

转载 作者:行者123 更新时间:2023-12-02 10:30:56 24 4
gpt4 key购买 nike

我对有关 Java 内存管理的几点感到有点困惑。

了解了堆栈和堆之间的区别,并且我去看了一个正确的示例,了解当我们执行某些代码时这些内存是什么。

我以这几行为例

public static void main(String[] args)
{
int a = 5;
calculate(a);
System.out.println(a); //will print 5 not 50
}
private static void calculatee(int a)
{
a = a * 10;
}

我了解了堆栈和堆中发生的情况。在这种情况下,变量不会被返回,并且没有对堆的引用。

在此示例中:

public static void maina(String[] args)
{
Customer customer = new Customer("John");
setAName(customer);
System.out.println(customer.getName()); // this will return Philip
}

private static void setAName(Customer c)
{
c.setName("Philip");
}

这次我可以看到对象的状态发生了变化!

栈不是共享的思想线程,但堆是共享的!这对我来说很有意义,当我打印它时,对象客户已将其值从 Jhon 更改为 Philip!伟大的!一切都有道理!

但是,我期待如果我这样做

public static void main(String[] args)
{
Integer i = new Integer(5);
calculate(i);
System.out.println(i); // printing 5 and not 50
}
private static void calculate(Integer i)
{
i = i * 10;
}

我会得到 50,而不是 5!

在本例中,Integer 是一个对象,我假设它是在堆中创建的!

有趣的是,如果我将 Integer 包装在 Customer 中,我将得到 50 而不是 5。

为什么会发生这种情况? Integer 类型不是在堆中创建的吗?

最佳答案

这是引用的问题,而不是堆和堆栈的问题。

调用方法calculate时,您传递一个引用(在您的例子中,是来自maini)。

诀窍是,Java 将在 calculate 内部创建一个新的引用。因此,calculate 内的 imain 内的 i 最初可能“指向”同一个对象,但它们并不“相同”。

因此,如果您将 calculate 中的 i 更改为乘法结果的对象,则不会自动更改 i 的引用code> 位于 main 内。

对于Customer,情况有所不同。您永远不会更改 setAName 中的 c 指向的位置。您更改了对象内部的一个引用,但同时更改了 main 内部的 customersetAName 中的 c 仍然指向那个对象!

这里有两张糟糕的画图来解释我的意思(以 0x 为前缀的数字是引用):

对于整数示例:

Integer Graph

对于客户示例:

Customer Graph

如有任何问题,请随时回来。

我希望这会有所帮助。

关于Java内存管理对象与原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53616563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com