所以我在读这本书,书中说如果我创建一个 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 引用什么?
谢谢!
最佳答案
首先:
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()
),并将一个指针添加到堆栈中。
其他可能性完全相同。
关于Java原始对象实例化: heap or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436968/