7

我的问题是,当我们将 String 声明为时,在字符串池和堆上创建字符串对象有String a = new String("abc");什么好处?

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

4

4 回答 4

6

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

String a = new String("abc");

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

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

于 2014-11-21T06:14:24.807 回答
3

首先,我建议您不要使用new String("abc"),因为它的行为与您描述的一样。其次,当您使用时,new您应该期望Object会创建一个新实例,并且确实如此。

于 2014-11-21T06:12:41.150 回答
0

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

    String str=new String("abc"); 

无论变量中的内容如何,​​都会创建新对象。其次,当您使用创建字符串时

    String str="abc"; 

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

于 2014-11-21T06:20:01.650 回答
0

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

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

  2. 字符串字面量 = "abc"; 字符串对象 = 新字符串(“abc”);System.out.println("结果 = " + 文字 == 对象); // 错误的

如果在编译时字符串对象存在于字符串常量池中,那么结果应该为真。

如果我错了,请纠正我。

于 2015-09-24T14:36:01.283 回答