可能重复:
有关Java字符串池的问题
我对java Strings对象创建有疑问.
String s1 = "Hello"+"world";
String s2 = s1+"Java";
Run Code Online (Sandbox Code Playgroud)
在这个程序中将创建多少String对象以及如何?请解释它.谢谢.
答案是3
每个JVM启动时将创建两个String对象:
两者都将被实习,因为它们是常量(在编译时已知).
每次运行此代码时,它们都将被重用.将创建一个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)
你不能真正说出,String创建了多少个,因为由于JVM的不同实现存在一些差异.
作为String一个不可变的类,天真的答案是5.但是通过一些优化(例如使用StringBuffer/ StringBuilder只有2 String秒.
由于会话将通过-calls汇总append().
编辑:因为这里有一些不同的答案解释为什么我说5:
| 归档时间: |
|
| 查看次数: |
1615 次 |
| 最近记录: |