Java字符串:创建了多少个对象

时间:2013-01-30 12:00:25

标签: java

我问了一个重复的问题,但我在Stack Overflow上经历了所有这样的问题,但我无法理解。

我的代码是:

String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;

1。创建了多少个对象? 2。我们怎么能说对象已经存在于String Table中?

- 真的很抱歉两面派,但我必须知道正确的答案

3 个答案:

答案 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

它与s1s2的唯一关系是它包含与它们相同的字母,但它是一个完全独立的对象。它基本上是这样构建的:

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