关闭

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

标签: java
1078人阅读 评论(0) 收藏 举报
分类:

原文: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,因为ab指向的都是位于方法区的同一个字符串,也就是他们的引用是一样的。

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

当同样的字符串再次被创建的时候,便不再创建新的字符串,这叫做“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都是创建不同的对象,因此cd的引用自然就不一致了。
下边的两幅图用以说明:
两种创建方式的区别

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. 用哪个呢?

如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:118703次
    • 积分:1133
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:3篇
    • 译文:3篇
    • 评论:2条
    最新评论