我在问一个重复的问题,但我在 Stack Overflow 上解决了所有类似的问题,但我无法理解。
我的代码是:
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;
1. 创建了多少个对象?2. 我们怎么能说对象已经存在于 String Table 中?
-真的很抱歉重复,但我必须知道正确的答案。
我在问一个重复的问题,但我在 Stack Overflow 上解决了所有类似的问题,但我无法理解。
我的代码是:
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;
1. 创建了多少个对象?2. 我们怎么能说对象已经存在于 String Table 中?
-真的很抱歉重复,但我必须知道正确的答案。
三个对象将在String
池中创建。
String s1 = "a"; // 1st Object
String s2 = "b"; // 2nd Object
String s3 = s1 + s2; // "ab" 3rd Object.
如果字符串在池中可用,那么它会自动指向该对象而不是创建新对象。
String str1 = "abc";
String str2 = "abc";
将有一个“abc”,string
str1 和 str2 都指向同一个“abc”。万一发生任何修改str2 +="d";
,它将在池中创建一个新对象,"abcd"
因为一旦创建了对象,我们就无法更改它的值。
注意:String
是不可变的。
这里创建了 3 个对象。
前两个对象很明显:
String s1 = "a"; // First
String s2 = "b"; // Second
第三个对象是一个新对象
String s3 = "a" + "b"; // Third
s1
它与它们的唯一关系s2
是它包含与它们相同的字母,但它是一个完全独立的对象。它基本上是这样构建的:
String s3 = new String(s1.toString() + s2.toString());
即使 2 个字符串包含相同的字符序列,它们也不是相同的字符串。
String s4 = "foo";
String s5 = "foo";
编辑
s4 == s5; // Evaluates to true
s4.equals(s5); // Evaluates to true
由于字符串池,上述两者都将评估为 true,但仍然是单独的对象。他们使用享元设计模式来节省内存。
另一方面:
String s6 = new String("foo");
String s7 = new String("foo");
s6 == s7; // Evaluates to false
s6.equals(s7); // Evaluates to true
在上面的示例中将创建三个对象。由于 String 是不可变的,每次您尝试更改字符串的值时,都会创建一个新对象。
String s1 = "a" // 1st object
String s2 = "b" // 2nd object
String s3 = s1+ s2 // in this case a new onject with value "ab" will be created