将在字符串常量池和堆中为以下代码创建多少个对象:
String s1 = "Stack";
String s2 = s1 + " Overflow";
据我所知,所有的文本都是在字符串常量池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,那么堆中也会创建一个对象吗?
String s1 = "Stack";
“Stack”
将位于字符串常量池中。
String s2 = s1 + " Overflow";
内部运算符
使用StringBuilder
连接字符串。
所以内部实现String s2=s1“溢出”
将是
String str = new StringBuilder(s1).append("Overflow").toString();
这里因为它是
new StringBuilder(str)
,所以将在堆中创建StringBuilder
对象。让我们看看StringBuilder(String str)
构造函数
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
和
超(int容量)
构造函数
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
这里我们可以看到,
StringBuilder(String str)
构造函数只是创建一个char[]数组
并调用append(String str)
方法。
如果我们看看
StringBuilder
的append(String str)
方法的实现,我们可以看到append(String str)
方法只是在玩char[]array
而不是创建任何新的对象或数组。
public StringBuilder append(String str) {
super.append(str);
return this;
}
以及
super的实现。追加(字符串str)
is
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
在最后,让我们看看
toString()
方法StringBuilder
类。
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuilder
的toString()
方法返回一个新字符串
,它肯定会在堆中,因为它是用
新字符串(…)创建的
;
上面的解释是,
StringBuilder只会在调用toString()时创建一个新字符串。在此之前,它会维护一个包含所有添加元素的char[]数组
因此,结论是“Stack”将位于字符串常量池中,s1“Overflow”即Stack Overflow将位于堆中
在字符串常量池中将创建两个对象。在编译时,编译器将追加这两个字符串,并且在字符串常量池中只创建一个对象,其他对象是s1。
package testPackage;
class Test {
public static void main(String[] args) {
String s1 = "Stack";
String s2 = s1 + " Overflow";
System.out.println(s1 == "Stack");
System.out.println(s1 == s2);
System.out.println(s2 == "Stack Overflow");
}
}
生成输出:
true
false
false
在下面的Java代码中将创建多少对象:
当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是
根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?
问题内容: 说我有这个表情 我知道,串池“允许运行时以节省内存在一个池保留不变的字符串” 字符串池 字符串池中将创建多少个字符串? 我最初的猜测是5 -,,,,,因为操作顺序的级联(左到右?),或者是它只是最后的结果,“TomBradyGoat”,存储在字符串池? 问题答案: 在运行时,这段代码将转换为单个对象。编译器将在编译时进行串联,并在常量池中添加一个值。
如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我
在Java 7或更低版本中,如果使用以下语法创建字符串 根据此链接,每当我们创建一个字符串对象时,都会创建两个对象,即堆区域中的一个和字符串常量池中的一个,并且字符串对象引用始终指向堆区域对象,如下所示。 如果我们创建另一个与 具有相同值的String对象,内存表示将是什么 这会在堆中创建另一个具有相同值的对象吗? 还是只会创建引用字符串常量池到堆中的对象?