(译)Create Java String Using ” ” or Constructor?

在Java中字符串可以有两种方式构造:

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

那这两种方式之间有什么区别呢?

1.双引号和构造方法

这个问题可以用两个简单的例子来解答。

例1:

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

a == b的结果是true,因为a和b在方法区域中引用了相同的字符串文字,内存引用是相同的。当多次创建相同的字符串文字时,只存储每个不同字符串值的一个副本, 这被称为 “string interning“, Java中的所有编译时常量字符串都会自动执行。要理解String的intern参考:http://blog.csdn.net/soonfly/article/details/70147205

Example 2:

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结果是false,因为c和d指向堆中的两个不同的对象,不同的对象总是有不同的内存引用。

该图说明了上述两种情况

constructor vs double quotes Java String - New Page

2.运行时字符串绑定

即使两个字符串是用构造函数构造的,仍然可以在运行时执行字符串实例

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”已经是String类型了,使用构造函数将会创建一个额外的不必要的对象,因此,如果你只需要创建一个字符串,就应该使用双引号。

另外,如果确实需要在堆中创建一个新对象,则应该使用构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值