在以下代码段中创建了多少个字符串对象

时间:2019-04-30 19:22:40

标签: java string

我需要帮助确定我将提供的代码创建了多少个对象。

我会假设只有一个对象,因为没有使用“ new”运算符,但是我不确定。

System.out.print("Enter a sentence : ");

mySentence = keyboard.next();

System.out.println("The original is  : " + mySentence);

mySentence.toUpperCase();

System.out.println("The same one is  : " + mySentence);

mySentence = mySentence.toUpperCase();

System.out.println("The raised is    : " + mySentence); 

3 个答案:

答案 0 :(得分:0)

每次调用toUpperCase()都会创建一个新的String对象。即使看起来像是同一对象,但从技术上讲,它们是内存中的不同对象,如此代码所示

String x = "hello";
String y = x.toUpperCase();
System.out.println(x.equals(y));
//yields false

因此,要回答您的问题,我想说创建了3个对象。尽管您没有将第二个保存在任何地方,但仍会创建它,然后立即将其丢弃

答案 1 :(得分:0)

Tldr:取决于。

每次创建字符串时,也会创建一个新对象(但这也取决于String pool)。您可以通过将两个字符串与==进行比较来证明这一点。 ==测试引用是否相等(它们是否是同一对象),而.equals()测试引用是否相等。

System.out.print("Enter a sentence : ");
final String mySentence = keyboard.next();
System.out.println("The original is  : " + mySentence);
final String mySentence2 = mySentence.toUpperCase();
System.out.println("The same one is  : " + mySentence);
final String mySentence3 = mySentence.toUpperCase();
System.out.println("The raised is    : " + mySentence3); 
System.out.println(mySentence == mySentence2);
System.out.println(mySentence3 == mySentence2);
System.out.println(mySentence3 == mySentence);

输入字符串“ FOO”的输出为(已创建1个对象)

The original is  : FOO
The same one is  : FOO
The raised is    : FOO
true
true
true

输入字符串“ foo”的输出为(创建了3个对象)

The original is  : foo
The same one is  : foo
The raised is    : FOO
false
false
false

toUpperCase()调用toUpperCase(Locale.getDefault()),仅在必须时才会创建新的String对象。如果输入字符串已经是大写字母,则返回输入字符串(see here)。

(如果您计算println中的字符串,则还有7个对象)

答案 2 :(得分:0)

我数十:

  1. 第一条语句创建一个String(“输入句子:”)(1)
  2. 第二条语句创建一个字符串(mySentence)(2)
  3. 第三条语句创建2个字符串(“”原始为“”和连接的字符串)(3,4)
  4. 第四句话创建一个新字符串(然后将其丢弃)(5)
  5. 第五条语句又创建了2个(6,7)
  6. 第六条语句又创建了一个(8)
  7. 最终声明又创建了2个(9,10)