Java 在普通内存和字符串池中创建新字符串

Java 在普通内存和字符串池中创建新字符串,java,string,string-pool,Java,String,String Pool,例如,如果: String str1 = “abc”; String str2 = new String(“def”); 那么 案例1:字符串str3=str1。concat(str2)将放入堆或池中 案例2:String str4=str2.concat(“HI”)将进入堆或池?在java中,使用new关键字创建的字符串将在堆内存中创建。若不使用new创建任何字符串,它将在字符串池中创建,并将被称为字符串常量。字符串常量池值只有一个副本,这意味着字符串池中不会有重复项。在第一个语法(Stri

例如,如果:

String str1 = “abc”;
String str2 = new String(“def”);
那么

案例1
字符串str3=str1。concat(str2)
将放入堆或池中


案例2
String str4=str2.concat(“HI”)
将进入堆或池?

在java中,使用new关键字创建的字符串将在堆内存中创建。若不使用new创建任何字符串,它将在字符串池中创建,并将被称为字符串常量。字符串常量池值只有一个副本,这意味着字符串池中不会有重复项。

在第一个语法
(String str1=“abc”)
中,只创建一个字符串对象和一个指向它的引用变量。该对象是在JVM维护的字符串常量池中创建的。 在第二种情况下,
String str2=新字符串(“def”),将创建两个字符串对象。因为调用了new,所以在普通内存中创建了一个String对象。此外,字符串常量“newstring”将被放置在字符串常量池中


因此,当我们没有New关键字时,我们只有一个String对象被创建在String常量池中。

所有字符串都在该池中<代码>新字符串
将创建新字符串,即使池字符串s=“abc”//中存在相同的字符串创建一个字符串对象和一个//引用变量在这个简单的例子中,“abc”将进入池中,s将引用它。字符串s=新字符串(“abc”);//在本例中,创建两个对象//和一个引用变量,因为我们使用了new关键字,Java将在普通(非工具)内存中创建一个新的String对象,s将引用它。此外,文字“abc”将放在池中。看起来像dupe和