java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

在Java中,一个字符串可以通过下面两种方法创建。

1
String x = "abc";
String y = new String("abc");

用双引号创建和用构造函数创建有什么区别那?

1、 双引号vs构造函数

这个问题可以通过下面两个简单的例子来回答。

例子1:

1
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a==b 为真,是因为在a和b都指向方法区域(保存常量池、字段和方法数据)

中相同的字符串常量。

当一个字符串常量被创建多次,只有一份字符串的值被保存。这被叫做“string interning”

所有编译时候的字符串常量在java中都是被自动interned。

例子 2:

1
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d为假是因为c和d分别引用堆中不同点对象。不同的对象当然有不同的内存的引用。

下面的图显示上面的两种情景:

2、 运行时String Interning

感谢LukasEder (他的建议如下):

String interning 即使两个字符串通过构造函数创建,在运行时候仍然可用。

1
String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

3、 什么时候使用它

因为字符串常量“abcd”也是个字符串类型,而且使用构造函数将创建个额外的对象。因此如果你需要创建一个引用字符串,应该使用双引号。

如果你需要在堆中创建一个新对象,那么应该使用构造函数。

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。