【发布时间】:2018-12-04 15:43:20
【问题描述】:
我对有关 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 包装在 Customer 中,我将得到 50 而不是 5。
为什么会这样? Integer 类型不是在 Heap 中创建的吗?
【问题讨论】:
-
相关:stackoverflow.com/questions/40480/…(与堆和堆栈无关,您的术语很混乱。)
标签: java memory memory-management jvm