所以我正在阅读本书,其中说如果我创建一个Point类然后通过Point p1 = new Point();
实例化它,那么我将会:
我想我得到了意思,但它让我思考。对于基本类型和字符串,“记忆明智”会发生什么,即:
之间的区别 - int x1 = 100;
- String s1 = "hello";
和
- int x2 = new Integer(100);
- String s2 = new String("hello");
在第一种情况下,'100'和'hello'是否会被实例化并存储在堆上?否则,x1和s1引用的是什么?
谢谢!
答案 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)
答案 2 :(得分:0)
S1和S2都将创建存储值的新内存引用。原始数据类型可以根据情况引用堆栈或堆。你可以看看here