我的问题是,当我们将 String 声明为时,在字符串池和堆上创建字符串对象有String a = new String("abc");
什么好处?
当我们将字符串创建为时,为什么不在堆中创建字符串String a = "abc"
。
我的问题是,当我们将 String 声明为时,在字符串池和堆上创建字符串对象有String a = new String("abc");
什么好处?
当我们将字符串创建为时,为什么不在堆中创建字符串String a = "abc"
。
java语言就是这样设计的。您在双引号之间使用的任何内容都是编译时间常数并进入字符串池。所以,在你的情况下:
String a = new String("abc");
"abc"
将被解析为编译时常量,因此将添加到当前 JVM 的字符串常量池中。
接下来, 的值a
将在运行时解析,并在运行时添加到堆中。
首先,我建议您不要使用new String("abc")
,因为它的行为与您描述的一样。其次,当您使用时,new
您应该期望Object
会创建一个新实例,并且确实如此。
首先让我在你写的时候澄清你
String str=new String("abc");
无论变量中的内容如何,都会创建新对象。其次,当您使用创建字符串时
String str="abc";
此时会在池中搜索此内容。如果任何字符串与新字符串匹配的内容相同,则只会在堆栈上创建引用,但它将指向较旧的一个堆位置。知道了?
我相信使用 new 运算符创建字符串对象,由于以下 2 个原因,不要在字符串常量池中创建对象。
Intern() 方法用于将字符串对象添加到字符串常量池中。如果字符串对象存在于字符串常量池中,则不使用 intern() 方法。
字符串字面量 = "abc"; 字符串对象 = 新字符串(“abc”);System.out.println("结果 = " + 文字 == 对象); // 错误的
如果在编译时字符串对象存在于字符串常量池中,那么结果应该为真。
如果我错了,请纠正我。