"text" 和 new String("text") 有什么区别?

新手上路,请多包涵

下面这两个语句有什么区别?

 String s = "text";

String s = new String("text");

原文由 user368141 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
2 个回答

new String("text"); 显式创建一个新的和引用不同的实例 String 对象; String s = "text"; 如果可用,可以重用 字符串常量池中 的一个实例。

很少 会想要使用 new String(anotherString) 构造函数。从 API:

String(String original) :初始化 新创建String 对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要原始的显式副本,否则不需要使用此构造函数,因为字符串是不可变的。

相关问题


参照区分是什么意思

检查以下片段:

     String s1 = "foobar";
    String s2 = "foobar";

    System.out.println(s1 == s2);      // true

    s2 = new String("foobar");
    System.out.println(s1 == s2);      // false
    System.out.println(s1.equals(s2)); // true

== 对两个引用类型进行引用标识比较。 equals 的两个对象不一定是 == 。在引用类型上使用 == 通常是错误的;大多数时候 equals 需要改用。

尽管如此,如果出于某种原因您需要创建两个 equals 而不是 == 字符串,您 可以 使用 new String(anotherString) 构造函数。然而,需要再次说明的是,这是 非常 奇特的,而且很少是本意。

参考

相关问题

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 3.0 许可协议

字符串 文字 将进入 String Constant Pool

下面的快照可能会帮助您 直观 地理解它,以便更长时间地记住它。

在此处输入图像描述


逐行创建对象:

 String str1 = new String("java5");

在构造函数中使用字符串文字“java5”,将一个新的字符串值存储在字符串常量池中。使用 new 运算符,在堆中创建一个新的字符串对象,并将“java5”作为值。

 String str2 = "java5"

引用“str2”指向字符串常量池中已经存储的值

String str3 = new String(str2);

在堆中创建一个新的字符串对象,其值与“str2”引用的值相同

String str4 = "java5";

引用“str4”指向字符串常量池中已经存储的值

总对象:堆 - 2,池 - 1

进一步阅读 Oracle 社区

原文由 Braj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题