2014-11-21 124 views
3

我的问题是什么是字符串池中创建字符串对象以及在我们声明字符串为String a = new String("abc");时有什么优势?为什么使用new运算符创建的字符串在字符串池中创建字符串literal

当我们创建字符串为String a = "abc"时,为什么不在堆中创建字符串?

+0

'new'确实*不*创建字符串池条目。在你称之为'new'之前,这个字面意思就是这样做的。如果您执行'new String(a)',则不会在字符串池中创建任何内容。 – Thilo 2014-11-21 06:33:46

+2

“有什么优势?”没有优势。唯一的缺点。这就是为什么不使用String构造函数的原因。 – Thilo 2014-11-21 06:35:11

+0

另请注意,编译器对原始包装器做了类似的事情。 'Integer x = 123;'也不会在堆中创建一个对象(它从一个池中获取,与字符串一样)。 – Thilo 2014-11-21 06:36:36

回答

4

java语言就是这样设计的。你在双引号之间使用的任何东西都是编译时间常量,并进入字符串池。所以,你的情况:

String a = new String("abc");

​​将被解析为一个编译时间常数,因此将被添加到字符串常量池当前JVM。

接下来,a的值将在运行时解析并在运行时添加到堆中。

+0

你的意思是我们没有得到任何具体的优势,所以最好不要使用new运算符来创建字符串。 – 2014-11-21 06:39:41

+0

@RishiKeshPathak - 这里没什么优势。你在堆中创建2个'abc's,另一个在字符串常量池中创建..在这种情况下,没有优势。实际上,你正在创建其他对象供GC工作如果你已经完成了'char [] c = {'a','b','c'}; String s = new String(c);'then'abc'将不在String常量池中。所以,你会很开心。 – TheLostMind 2014-11-21 06:42:25

+0

谢谢你的帮助。 – 2014-11-21 06:55:27

3

首先,我建议你不是使用new String("abc"),因为它的行为如你所述。其次,当您使用new时,您应该预计将会创建一个新的Object实例。

0

,首先让我清楚你当你写

String str=new String("abc"); 

创建的,不论在可变内容的新对象。 其次,当你使用

String str="abc"; 

此时该内容将在游泳池中搜索字符串创建。如果任何字符串与新内容匹配的内容相同,则只会在堆栈上创建引用,但会指向较旧的一个堆位置。得到它了?

0

我相信通过使用new运算符创建字符串对象,因为以下2个原因,不要在字符串常量池中创建对象。

  1. Intern()方法用于将字符串对象添加到字符串常量池中。如果字符串对象存在于字符串常量池中,则不会使用intern()方法。

  2. String literal =“abc”; String object = new String(“abc”); System.out.println(“result =”+ literal == object); // false

如果字符串对象在编译时存在于字符串常量池中,则结果应为true。

如果我错了,请纠正我。

+0

你的两个点都是用new操作符创建String的结果。我想实际上我们不应该在现实世界中使用字符串,它只有缺点没有好处。但它只是因为String是一个Object而退出,并且可以使用构造函数进行初始化。详细阅读最佳答案。 – 2015-09-25 14:32:12