Java原始对象实例化: heap or not?

标签 java heap-memory 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 引用什么?

谢谢!

最佳答案

首先:

 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/

相关文章:

c - Windows触发了一个断点——C语言

java - 从 Class<? 中获取枚举实例使用字符串值扩展枚举>?

java - 使用assertJ方法 containsOnly() 比较自定义对象的数组

Java BufferedWriter(OutputStreamWriter) 未检测到输出已关闭(例如,manylines | java ... | head -3)

c++ - 为什么分配堆内存比分配栈内存快得多?

java - 如何增加内存大小到java的堆

c# - 类的实例不存在?

dictionary - 分配给 nil 映射中的条目

java - NetBeans Glassfish 卡在 "In-place deployment at..."

java - Gradle 源集 : classesDir has been deprecated