java中的字符串对象创建

时间:2013-01-07 04:19:39

标签: java string

  

可能重复:
  Questions about Java’s String pool

我对java Strings对象创建有疑问。

String s1 = "Hello"+"world";
String s2 = s1+"Java";

在这个程序中将创建多少个String对象以及如何创建?请解释一下。 感谢。

5 个答案:

答案 0 :(得分:5)

答案是3

每个JVM启动时将创建两个String对象:

  • 的 “HelloWorld”
  • 的 “Java”

两者都是interned,因为它们是常量(在编译时已知)。

每次运行此代码时都会重复使用它们。将创建一个StringBuilder来连接上面的两个String。对它们的引用将分配给s1和s2。

这是代码的字节码:

   0:   ldc #37; //String Helloworld
   2:   astore_1
   3:   new #39; //class java/lang/StringBuilder
   6:   dup
   7:   aload_1
   8:   invokestatic    #41; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   11:  invokespecial   #47; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   14:  ldc #50; //String Java
   16:  invokevirtual   #52; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #56; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:  astore_2
   23:  return

答案 1 :(得分:5)

您无法真实地说,创建了多少String,因为由于JVM的不同实现存在一些差异。

由于String是一个不可变的类,天真的答案是5.但是通过一些优化(例如使用StringBuffer / StringBuilder,只有2 String个。

因为会话将通过append() - 来电来总结。

编辑:因为这里有一些不同的答案解释为什么我说5:

  1. “你好”
  2. “世界”
  3. (s1)“Helloworld”
  4. 的 “Java”
  5. (s2)“HelloworldJava”

答案 2 :(得分:2)

如果查看编译后的代码,可以轻松猜出:

String s1 = "Helloworld";
String s2 = (new StringBuilder(String.valueOf(s1))).append("Java").toString();

我们无法通过查看源代码来准确了解,因为编译器在执行之前会进行许多优化。

这里我们看到为s1创建了1个String对象,为s2创建了另一个String对象。这里有2个字符串文字在字符串池中:“Helloworld”和“Java”

答案 3 :(得分:1)

如果您反编译Program.class,您将看到真实的代码

String s1 = "Helloworld";
String s2 = (new StringBuilder(String.valueOf(s1))).append("Java").toString();
看起来有10个对象,因为在每个String中都有char[] value这是一个单独的对象+ StringBuilder中的另一个char []

答案 4 :(得分:-1)

是的,将会创建五个String对象。字符串是不可改变的;以下是步骤 - 1.首先“你好” 2.然后另一个对象“Hello World” 3.然后另一个对象“Java” 4.然后s1 +“Java” 然后最终会创建s2。