java中String对象声明的问题

String aaa=new String("123");
String bbb="123";

这两种声明方法有什么区别?难道后者没有创建一个String对象?

阅读 2.4k
2 个回答

有一定的区别,如果没有特殊需求,也没有用到new String("123") 的需求。

String str1="ABC"; 和String str2 = new String("ABC");

String str1="ABC" 可能创建一个对象或者不创建对象,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").如果已经存在,str1直接reference to 这个String池里的对象。

String str2 = new String("ABC") 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str2 的String 对象,它的value 是 "ABC".同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").

这两行代码的字节码指令如下
 public static void main(java.lang.String[]);
   Code:
      0: new           #2                  // class java/lang/String  创建一个String对象,并且其引用进栈
      3: dup
      4: ldc           #3                  // String 123    将String型常量值从常量池中推送至栈顶
      6: invokespecial #4                  // Method java/lang/String."<init>":   调用String构造方法 public String(String original) 
Ljava/lang/String;)V
      9: astore_1                         
     10: ldc           #3                  // String 123    将String型常量值从常量池中推送至栈顶
     12: astore_2
     13: return
     这就是他们的区别。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题