我对java Strings对象创建有疑问。
String s1 = "Hello"+"world";
String s2 = s1+"Java";
在这个程序中将创建多少个String对象以及如何创建?请解释一下。 感谢。
答案 0 :(得分:5)
答案是3
每个JVM启动时将创建两个String对象:
两者都是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:
答案 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。