0

所以我正在阅读这本书,它说如果我创建一个类 Point 然后通过执行实例化它,Point p1 = new Point();那么我将拥有:

  • 堆上的 Point 对象(作为“new”关键字的结果);
  • 对该对象的引用(p1);
  • 当一个对象没有引用时,它可以被垃圾收集器处理掉。

我想我明白了意思,但它让我思考。原始类型和字符串在“内存方面”会发生什么,即:

 - int x1 = 100;
 - String s1 = "hello";

 - int x2 = new Integer(100);
 - String s2 = new String("hello");

在第一种情况下,'100' 和 'hello' 会被实例化并存储在堆上吗?否则,什么是 x1 和 s1 引用?

谢谢!

4

3 回答 3

2

首先:

 int x2 = new Integer(100);

这意味着一个Integer对象被创建、出箱(JVM 返回它的intValue)并100分配给一个int原语。该Integer对象不再被引用并且可以被释放(当然也许 JIT 可以将其优化为int x2 = 100)。

我假设您在谈论局部变量,因为属性是对象的一部分,因此位于堆中。

 int x1 = 100;

在堆栈中声明一个 int 变量并赋值

 String s1 = "Hello";

一个 String 对象被创建(或被引用,参见String.intern())并且一个指针被添加到堆栈中。

其他可能性完全相同。

于 2012-07-11T16:24:16.650 回答
1

本地原语将被放入堆栈,但对象的成员字段将与该对象一起放入堆中(无论它是否是原始的)。更多信息在这里

字符串是对象并且存在于堆上。不过,它们的工作方式确实有所不同,这里有一些信息。

于 2012-07-11T16:23:37.107 回答
0

S1 和 S2 都将在存储值的位置创建新的内存引用。根据具体情况,原始数据类型可能指的是堆栈或堆。你可以看看这里

于 2012-07-11T16:29:27.050 回答