您的位置:首页 > 编程语言 > Java开发

Java创建字符串是用“”还是用构造器?

2015-11-17 21:25 274 查看
原文:Create Java String Using ”” or Constructor?

翻译:get-set

Java中,创建字符串有两种方式:

String a = "abc";
String b = 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
是true,因为
a
b
指向的都是位于方法区的同一个字符串,也就是他们的引用是一样的。

==
是进行值的比较,对于原始类型来说,就是比较它们的值,对于引用类型来说,就是检查它们引用的是不是同一个对象。

当同样的字符串再次被创建的时候,便不再创建新的字符串,这叫做“String interning”,编译期的字符串常量是自动interned的(就是会维护一个常量池,如果池中有这个字符串,那么直接引用之,否则再创建)。

例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指向的不是一个引用,构造方法创建的字符串对象位于堆内存中,每次
new
都是创建不同的对象,因此
c
d
的引用自然就不一致了。

下边的两幅图用以说明:



2. 运行时String Interning

当运行时,仍然可以实现String Interning,即使是使用构造方法创建的字符串:

String e = new String("abcd").intern();
String f = new String("abcd").intern();
System.out.println(e == f); // True
System.out.println(e.equals(f)); // True


执行
s.intern()
方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池中有与之相等的字符串,则不会将外部的字符串放到共享池中的,返回的只是共享池中的字符串,如果不同则将外部字符串放入共享池中,并返回其字符串的句柄(引用)– 这样做的好处就是能够节约空间。

3. 用哪个呢?

如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java