我问了一个重复的问题,但我在Stack Overflow上经历了所有这样的问题,但我无法理解。
我的代码是:
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;
1。创建了多少个对象? 2。我们怎么能说对象已经存在于String Table中?
- 真的很抱歉两面派,但我必须知道正确的答案。
答案 0 :(得分:1)
将在String
池中创建三个对象。
String s1 = "a"; // 1st Object
String s2 = "b"; // 2nd Object
String s3 = s1 + s2; // "ab" 3rd Object.
如果字符串在池中可用,则它会自动指向该对象,而不是创建新的对象。
String str1 = "abc";
String str2 = "abc";
string
中会有一个“abc”,str1和str2都指向同一个“abc”。如果发生任何修改,如str2 +="d";
,那么它将在池"abcd"
中创建一个新对象,因为一旦创建了Object,我们就无法更改其值。
注意:String
是不可变的。
答案 1 :(得分:0)
这里创建了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,但仍然是单独的对象。他们使用flyweight设计模式以节省内存。
另一方面:
String s6 = new String("foo");
String s7 = new String("foo");
s6 == s7; // Evaluates to false
s6.equals(s7); // Evaluates to true
答案 2 :(得分:0)
在上面的例子中将创建三个对象。 由于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