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

来源:互联网 发布:mac这么下载阿里旺旺 编辑:程序博客网 时间:2024/05/16 16:22

原文: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); //TrueSystem.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);  //FalseSystem.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); // TrueSystem.out.println(e.equals(f)); // True

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

3. 用哪个呢?

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

0 0
原创粉丝点击