-3

我在问一个重复的问题,但我在 Stack Overflow 上解决了所有类似的问题,但我无法理解。

我的代码是:

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

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

-真的很抱歉重复,但我必须知道正确的答案

4

3 回答 3

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";

将有一个“abc”,stringstr1 和 str2 都指向同一个“abc”。万一发生任何修改str2 +="d";,它将在池中创建一个新对象,"abcd"因为一旦创建了对象,我们就无法更改它的值。

注意:String是不可变的。

于 2013-01-30T12:03:02.917 回答
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,但仍然是单独的对象。他们使用享元设计模式来节省内存。

另一方面:

String s6 = new String("foo");
String s7 = new String("foo");

s6 == s7;      // Evaluates to false
s6.equals(s7); // Evaluates to true
于 2013-01-30T12:07:33.327 回答
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
于 2013-01-30T12:08:38.803 回答