在Java中,可以使用两种方法来创建字符串:
1 String x = "abc"; 2 String y = new String("abc");
使用双引号和使用构造函数之间的区别是什么?
可以通过使用两个简单的代码示例来回答这个问题。
示例1:
1 String a = "abcd";
2 String b = "abcd";
3 System.out.println(a == b); // True
4 System.out.println(a.equals(b)); // True
当不止一次创建同样的字符串字面值时,每个不同的字符串值只有一个副本被保存,这叫做“字符串的驻留”,在Java中所有的编译时不变的字符串自动驻留。
示例2:
1 String c = new String("abcd"); 2 String d = new String("abcd"); 3 System.out.println(c == d); // False 4 System.out.println(c.equals(d)); // True
c==d为假,因为c和d是指的是堆中两个不同的对象,不同对象总是有不同的内存引用。
这张图描述了上面两种情形:
2.运行时的字符串驻留
字符串驻留还可以在运行时实现,即使两个字符串是由构造函数创建的:
1 String c = new String("abcd").intern(); 2 String d = new String("abcd").intern(); 3 System.out.println(c == d); // Now true 4 System.out.println(c.equals(d)); // True
3.该使用哪种方式
因为字面值“abcd”已经是String类型,使用构造函数将创建一个额外的不必要的对象。因此,如果你只需要创建一个字符串,应该使用双引号。
如果你需要在堆中创建一个新的对象,应该使用构造函数。这里是一个使用案例。