Java语言程序设计(一)

new String(a) + new String(b) 会创建几个对象?

3个
a,b还有拼接之后的字符串

1.常量池 a;
2.new string(a)
3.常量池 b;
4.new string(b)
5.字符串拼接会调用new StringBuilder
6.拼接完成后会调用stringbuilder 的 tostring 方法

该回答引用ChatGPT4与博主@晓码自在合作编写:

这行代码会创建3个字符串对象:

new String(a) 会创建一个字符串对象
new String(b) 会创建一个字符串对象
new String(a) + new String(b) 会再创建一个字符串对象用于拼接

所以总共会创建3个字符串对象。

这是因为String类是不可变的(immutable),所以每次拼接字符串,都会创建一个新的字符串对象。

例如:

java
String a = "Hello";
String b = "World";
String c = a + b;

这里会创建3个字符串对象:

"Hello"
"World"
"HelloWorld"

如果进行多次拼接,对象数会成倍增加:

java
String d = c + "!";

现在会有4个对象:

"Hello"
"World"
"HelloWorld"
"HelloWorld!"

为了避免创建过多的临时字符串对象,可以使用StringBuilder类,它是可变的(mutable),拼接字符串不会创建新的对象:

java
StringBuilder sb = new StringBuilder("Hello");
sb.append("World");
String c = sb.toString();

这里只会创建2个对象:

"HelloWorld"
"HelloWorld"

sb对象在append时改变了自身,没有创建新的对象。toString()方法才会返回一个新的字符串对象。

所以,对于多个字符串拼接,应该优先选择StringBuilder,以减少创建过多临时对象的开销。

该回答引用自ChatGPT:在Java中,new String(a) + new String(b)语句会创建三个字符串对象。

  1. new String(a):这会创建一个字符串对象,内容与字符串a相同。
  2. new String(b):同样,这会创建另一个字符串对象,内容与字符串b相同。
  3. new String(a) + new String(b):这个表达式是字符串的拼接操作。它会创建一个新的字符串对象,内容是将第一个字符串对象(由new String(a)创建)和第二个字符串对象(由new String(b)创建)连接在一起形成的新字符串。

需要注意的是,在Java中,字符串是不可变的(immutable)对象。因此,每次对字符串进行操作(如拼接),都会创建一个新的字符串对象。在上述代码中,因为使用了两个new String()操作,所以总共会创建三个字符串对象。

  • 这篇文章讲的很详细,请看:Java中的常量池及 String赋值及new String
  • 除此之外, 这篇博客: new String()会创建几个对象中的 问题二:new String("a") + new String("b") 会创建几个对象? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         会创建了6个对象:

    • 对象1:new StringBuilder()
    • 对象2:new String("a")
    • 对象3:常量池的 a
    • 对象4:new String("b")
    • 对象5:常量池的 b
    • 对象6:调用StringBuilder.toString()中会创建一个 new String("ab")

            (ps:调用toString方法,不会在常量池中生成新对象ab)

    public void test2(){
        String str = new String("a") + new String("b");
    }

            字节码如下:

     0 new #2 <java/lang/StringBuilder> // 创建StringBuilder(对象1)
     3 dup
     4 invokespecial #3 <java/lang/StringBuilder.<init> : ()V>
     7 new #4 <java/lang/String> // 创建String(对象2)
    10 dup
    11 ldc #5 <a> // 加载字符串常量a(对象3)
    13 invokespecial #6 <java/lang/String.<init> : (Ljava/lang/String;)V>
    16 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;>
    19 new #4 <java/lang/String> // 创建String(对象4)
    22 dup
    23 ldc #8 <b> // 加载字符串常量b(对象5)
    25 invokespecial #6 <java/lang/String.<init> : (Ljava/lang/String;)V>
    28 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;>
    31 invokevirtual #9 <java/lang/StringBuilder.toString : ()Ljava/lang/String;> // 调用StringBuilder.toString(对象6)
    34 astore_1
    35 return

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料,使用代码 new String(a) + new String(b) 会创建6个对象,分别为: 1. StringBuilder 对象 2. String(a) 对象 3. 常量池里的 a 4. String(b) 对象 5. 常量池里的 b 6. 调用 StringBuilder.toString() 时创建的一个 new String("ab") 对象

    具体的创建过程如下:

    // 创建 StringBuilder 对象
    StringBuilder sb = new StringBuilder();
    // 创建 String(a) 对象并加入 sb 中
    String str1 = new String(a);
    sb.append(str1);
    // 创建 String(b) 对象并加入 sb 中
    String str2 = new String(b);
    sb.append(str2);
    // 调用 sb.toString() 方法创建 new String("ab") 对象
    String result = sb.toString();
    

    因此,总共创建了6个对象。