我知道这可能是非常基本的,而且可能是非常直接的,但我不能清楚地理解在这种情况下会发生什么,所以,就这样。
在以下代码中:
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;我知道str1和str2将分别在(字符串常量池)中创建一个对象"Hello“和"World”。对于str3,一个新的对象是在之外创建的字符串常量池,它指向"HelloWorld“,它是在字符串常量池中创建的。
我的问题是,如果我连接2个或更多字符串(使用'+‘或concat()方法),会发生什么?
一个新的对象是在外部创建池,就像String str3的情况一样,还是str4将直接指向对象"HelloWorld“,在中,字符串常量池
PS :和如果类似于在池之外创建新对象,那么如果不使用新关键字,它是如何发生的呢?
发布于 2018-06-01 06:10:02
首先,String s = new String("abs");将创建两个对象,一个在池区域,另一个在非池区域,因为您使用的是新的和字符串文本作为参数。
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;到目前为止,您有5个String对象,4个String常量池,1个String常量池。所以您的str4是字符串池中的一个新对象,请检查下面的代码,
String str5="HelloWorld"; //This line will create one more String Constant Pool object because we are using the variable name as str5.
String str6="HelloWorld";////This line will not create any object, this will refer the same object str5.供测试
System.out.println(str3==str4); //false
System.out.println(str4==str5);//false
System.out.println(str5==str6);//true发布于 2018-06-01 07:26:08
首先,这不是一个答案,这是通过你自己或对情况的解释来获得答案的方法。
两个字符串的连接总是创建字符串的一个新对象。
要符合这一要求,您可以做一件事情,即它如何在内存堆和池中进行管理。
1:转到NetBeans:
2:编写这样的程序:
public class StringTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;
String str5 = str1 + str2;
String str6 = str1.concat(str2);
String str7 = "HelloWorld";
String str8 = "HelloWorld";
System.out.println("");
}
}他说:在System.out.println("");这条线上放一个断点。
4:现在调试这段代码。
5:转到变量窗口(窗口->调试->变量),如下所示:

6:现在,右键单击str8并选择标记对象.并给该对象添加一些标签,比如Same Object。
现在,您可以看到str7上也出现了相同的标记行,如下所示:

这表明两个引用( str7' andstr8` )都是引用相同的对象。
7:现在检查一下str3-4-5-6所有的引用,用不同的标签行标记它们,比如:

要进一步对该对象进行内部管理,只需右键单击变量窗口中的变量名,查看Show Refereances选项,如:


更新:
str7-8是从池中引用的对象,这与第7点的屏幕截图中描述的str4-5-6不同。str5与str7进行比较来确认它,如果它返回true,则连接在池中创建对象,因为str7引用池,并且都引用相同的对象,但由于两者不相同,所以返回false。发布于 2021-01-10 11:31:39
在阅读我的评论之前,要记住两点。
现在,
String s = "you"; // s in scp
String s1 = s + "me"; // "me" in scp and runtime operation here will put s1 in heap
String s2 = "youme"; // s2 in scp要确定我上面的观点,请参阅下面的代码。
System.out.println(s1 == s2); // false , since s1 is in heap and s2 is in scp
System.out.println(s1.intern() == s2); // true , since s2 in scp and s1.intern() in scp如果有像下面这样。
String s3 = "you" + "me"; //operation is compile time now, s3 in scp所以,
System.out.println(s3 == s2); // true, s3 in scp and s2 in scp注意:字符串的"abc“值是编译时常数。
https://stackoverflow.com/questions/50636396
复制相似问题