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

翻译 2015年11月17日 21:25: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); //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. 用哪个呢?

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

举报

相关文章推荐

JAVA中创建字符串的两种方式的区别

JAVA中创建字符串的两种方式的区别,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建。建议在平时的应用中,应尽量使用String x = "abcd"这种方式来创建字...

Java中String类通过new创建和直接赋值字符串的区别

方式一:String a = “aaa” ;方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优。 因为字符串是保存在常量池中的,而通...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Java反射创建对象-自适应构造器

Java的反射非常强大,它能访问对象的私有field、method,私有构造器,甚至私有的内部类和匿名内部类。反射就像是Java提供的后门,对OOP来说它提供了一种非安全的访问方式。它是一种特殊手段,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)