一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

java基础系列 03 | 创建java字符串是使用""还是构造函数?

在java中,创建字符串可以有两种方式:

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

使用双引号和构造函数到底有什么区别呢?

1. 双引号 VS. 构造函数

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

例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中的所有编译时常量字符串都会自动实现。

例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 引用堆 (heap) 中的两个不同对象。不同的对象总是有不同的内存引用。

该图说明了上述两种情况:

《java基础系列 03 |  创建java字符串是使用

2. 运行时(Run-Time) String Interning

String interning 仍然可以在运行时完成,即使使用构造函数构造了两个字符串:

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类型,所以使用构造函数会创建一个额外的不必要的对象。因此,如果你只需要创建一个字符串,则应使用双引号。

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

说明:

1.直接定义字符串变量的时候赋值,如果表达式右边只有字符串常量,那么就是把变量存放在常量池里面。

2.new出来的字符串是存放在堆里面。

3.对字符串进行拼接操作,也就是做”+”运算的时候,分两种情况:

i.表达式右边是纯字符串常量,那么存放在栈里面。

ii.表达式右边如果存在字符串引用,也就是字符串对象的句柄,那么就存放在堆里面。

 

 

《java基础系列 03 |  创建java字符串是使用

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注