java中的字符串对象创建

And*_*azy 6 java string

可能重复:
有关Java字符串池的问题

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

String s1 = "Hello"+"world";
String s2 = s1+"Java";
Run Code Online (Sandbox Code Playgroud)

在这个程序中将创建多少String对象以及如何?请解释它.谢谢.

Boh*_*ian 5

答案是3

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

  • "你好,世界"
  • "Java" 的

两者都将被实习,因为它们是常量(在编译时已知).

每次运行此代码时,它们都将被重用.将创建一个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
Run Code Online (Sandbox Code Playgroud)

  • 嗯.我打算说四,因为连接运算符不会追加,而是实例化一个新的字符串.你偶然有参考链接吗?s1怎么样,哪个不是常数? (3认同)

Zhe*_*dar 5

你不能真正说出,String创建了多少个,因为由于JVM的不同实现存在一些差异.

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

由于会话将通过-calls汇总append().

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

  1. "你好"
  2. "世界"
  3. (第1节)"Helloworld"
  4. "Java" 的
  5. (第2条)"HelloworldJava"