我的问题是,当我们将String声明为String a = new String("abc");
时,在字符串池和Heap中创建字符串对象的用途是什么?
当我们将字符串创建为String a = "abc"
时,为什么不在堆中创建字符串。
答案 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个原因,不要在字符串常量池中创建对象。
Intern()方法用于将字符串对象添加到字符串常量池。如果string对象存在于字符串常量池中,则不使用intern()方法。
String literal =“abc”; String object = new String(“abc”); System.out.println(“result =”+ literal == object); //假
如果在编译时字符串常量池中存在字符串对象,则结果应为true。
如果我错了,请纠正我。