在Java 7或更低版本中,如果使用以下语法创建字符串
String s1=new String("abc");
根据此链接,每当我们创建一个字符串对象时,都会创建两个对象,即堆区域中的一个和字符串常量池中的一个,并且字符串对象引用始终指向堆区域对象,如下所示。
----------------------------------------------
| Heap | String Constant Pool |
|---------------------|-----------------------
| | |
| "abc" | "abc" |
| ^ | |
| | | |
| s1 | |
如果我们创建另一个与
具有相同值的String对象,内存表示将是什么
String s2=new String("abc");
这会在堆中创建另一个具有相同值的对象吗?
还是只会创建引用字符串常量池到堆中的对象?
----------------------------------------------
| Heap | String Constant Pool |
|---------------------|-----------------------
| | |
| "abc" "abc" | "abc" |
| ^ ^ | |
| | | | |
| s1 s2 | |
正如Andy Turner所说,new
运算符总是生成一个新实例。它由JLS保证。
唯一的小问题是,在某些情况下(例如,如果在某些JVM版本中启用了转义分析),新的操作符可能会在堆栈而不是堆上分配对象。
每个人都知道这一点。Net framework字符串对象直接存储在堆内存中 我只是想弄清楚里面是否有保留的记忆。Net字符串框架。在java中,有一个为字符串保留的内存,称为SCMP(字符串常量内存池),在这里字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。
根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?
将在字符串常量池和堆中为以下代码创建多少个对象: 据我所知,所有的文本都是在字符串常量池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,那么堆中也会创建一个对象吗?
如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我
在爪哇 使用新运算符创建的对象将存储在堆内存中 我正在运行下面的代码来检查hashcode。 代码的输出是 这两个对象都是使用新运算符和字符串文字创建的,并相应地存储在不同的位置堆内存和字符串常量池中。那么内存地址是如何相同的。 如果我错了,请解释一下这个概念
当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?