我知道这可能是非常基本的,可能很直接,但我不能清楚地了解在这种情况下会发生什么,所以,在这里。
在以下代码中:
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;
我知道str1和str2会创建一个对象" Hello"和"世界"分别内部 字符串常量池。对于str3,在外部创建一个新对象 String Constant Pool ,它指向" HelloWorld"在 字符串常量池中创建。
我的问题是,如果我连续2个或更多字符串(使用' +'或concat()方法)会发生什么?
是否会在 String str3 的情况下在外部中创建一个新对象,或者str4将直接指向该对象" HelloWorld" 内部 字符串常量池
PS:和 IF 这种情况类似于创建新对象外部池,那么如何在不使用 新 关键字?
答案 0 :(得分:2)
首先String s = new String("abs");
它将创建两个对象,一个对象进入池区域,另一个对象在非池区域中,因为您使用new和字符串文字作为参数。
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;
直到现在你有五个String对象,四个在String Constant Pool中,一个在Heap中。所以你的str4完全是String Pool中的一个新对象, 请检查以下代码,
String str5="HelloWorld"; //This line will create one more String Constant Pool object because we are using 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
答案 1 :(得分:1)
首先,这不是一个答案,这是您自己回答或解释情况的方法。
两个字符串的连接总是创建字符串的新对象
为了符合这一点,你可以做一件事,就是如何在内存堆和池中进行管理。
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("");
}
}
3:只需在System.out.println("");
这一行设置一个断点
4:现在调试这段代码
5:转到变量窗口(Window-> Debugging-> Variables),如下所示:
6:现在右键单击str8
并选择标记对象... ,并为该对象提供一些标记,如Same Object
。
现在您可以看到同一标记行也出现在str7
上,如:
这表明两个引用str7' and
str8`都引用相同的对象。
7:现在通过使用不同的标记行标记str3-4-5-6
所有引用来检查此内容:
对于该对象的更多内部管理,只需在变量窗口中右键单击变量名称即可查看Show Refereances
选项,如:
<强>更新强>
- 连接在堆中创建对象
- 确保声明该池的look语句不能包含具有相同值的多个字符串
- 此处str7-8
是池中的对象,与str4-5-6
不同,如第7点的屏幕截图所示。
- 您还可以通过使用str5
运算符将str7
与==
进行比较来确认它,如果它返回true
,则连接会在池中创建对象,因为
str7
引用池并且两者都被引用相同的对象,但它将返回false,因为它们都不相同。
答案 2 :(得分:1)
为回答您的问题,在池外创建了str4对象。
这是我的解释:
String s = "abc";
String s1="xyz";
String s3 = "abcxyz";
String s2=s+s1;
if(s2 == s3){
System.out.println("true");
}else{
System.out.println("false");
}
这将打印错误。这意味着s2没有引用s3创建的池对象。
答案 3 :(得分:1)
在阅读我的评论之前要记住两点。
现在
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
注意:String 的 "abc" 值为编译时常量
答案 4 :(得分:0)
**str4 is stored in heap.**
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;
String str5="HelloWorld";
if str4 is stored on string pool then str5 will point to same object where str4 is pointing.
but this statement giving me false output-:
**System.out.println(str4 == str5);**
***************output****************
false
String str4 = (str1 + str2).intern();
String str5="HelloWorld";
but if you are using String.intern then this method will try to find a String with the same sequence of characters in the pool.
**System.out.println(str4 == str5);**
***************output******************
true
[1]: https://i.stack.imgur.com/IjMhP.png