Java原始对象instanciation:堆与否?

时间:2012-07-11 16:16:51

标签: java heap instantiation

所以我正在阅读本书,其中说如果我创建一个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引用的是什么?

谢谢!

3 个答案:

答案 0 :(得分: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())并将指针添加到堆栈中。

其他可能性完全相同。

答案 1 :(得分:1)

本地基元将被放入堆栈,但是对象的成员字段将被放置在具有该对象的堆上(无论它是否是原始的)。更多信息here

字符串是对象并存在于堆上。但它们的工作方式略有不同,有些信息here

答案 2 :(得分:0)

S1和S2都将创建存储值的新内存引用。原始数据类型可以根据情况引用堆栈或堆。你可以看看here