当前位置: 首页 > 知识库问答 >
问题:

在字符串常量池和堆中创建多少个对象

徐瑞
2023-03-14

将在字符串常量池和堆中为以下代码创建多少个对象:

String s1 = "Stack";  
String s2 = s1 + " Overflow";

据我所知,所有的文本都是在字符串常量池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,那么堆中也会创建一个对象吗?

共有2个答案

陆子航
2023-03-14
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)方法。

如果我们看看StringBuilderappend(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);
}

StringBuildertoString()方法返回一个新字符串,它肯定会在堆中,因为它是用新字符串(…)创建的

上面的解释是,StringBuilder只会在调用toString()时创建一个新字符串。在此之前,它会维护一个包含所有添加元素的char[]数组

因此,结论是“Stack”将位于字符串常量池中,s1“Overflow”即Stack Overflow将位于堆中

顾文昌
2023-03-14

在字符串常量池中将创建两个对象。在编译时,编译器将追加这两个字符串,并且在字符串常量池中只创建一个对象,其他对象是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对象,内存表示将是什么 这会在堆中创建另一个具有相同值的对象吗? 还是只会创建引用字符串常量池到堆中的对象?