为什么使用new运算符创建的String在字符串池中创建字符串文字

时间:2014-11-21 06:10:30

标签: java string string-pool

我的问题是,当我们将String声明为String a = new String("abc");时,在字符串池和Heap中创建字符串对象的用途是什么?

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

4 个答案:

答案 0 :(得分:6)

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

String a = new String("abc");

"abc"将被解析为编译时常量,因此将被添加到当前JVM的String常量池中。

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

答案 1 :(得分:3)

首先,我建议您使用new String("abc"),因为它的行为与您所描述的相同。其次,当您使用new时,您应该会创建一个新的Object实例,并且它是。

答案 2 :(得分:0)

首先让我在你写的时候清楚你

    String str=new String("abc"); 

创建新对象,而不管变量中的内容如何。 其次,使用

创建String时
    String str="abc"; 

此时将在池中搜索此内容。如果任何字符串与新的字符串匹配相同的内容,那么将仅在堆栈上创建引用,但它将指向较旧的一个堆位置。知道了吗?

答案 3 :(得分:0)

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

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

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

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

    如果我错了,请纠正我。