【问题标题】:How many string objects are created in the following code segment以下代码段中创建了多少个字符串对象
【发布时间】:2019-09-19 12:01:14
【问题描述】:

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

我会假设只有一个对象,因为没有使用“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); 

【问题讨论】:

  • 至少三个。一个在keyboard.next(),第二个在第一个 toUpperCase(没有保存参考),然后第三个在第二个toUpperCase()。 JIT 可能会消除第一个 toUpperCase。
  • @ElliottFrisch:是的,我没有计算立即消耗的对象。
  • @ElliottFrisch 4-6 不计算文字。 1 表示keyboard.next() 返回的字符串,3 表示字符串连接。如果 mySentence 还不是全部大写,那么可能还有 2 个。
  • @MrSpark 为什么您认为字符串字面量以外的任何内容都存储在字符串池中?任何地方都没有intern() 电话。

标签: java string


【解决方案1】:

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

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

所以要回答你的问题,我会说创建了 3 个对象;尽管您没有在任何地方保存第二个,但它仍然被创建然后立即丢弃

【讨论】:

  • 刚刚意识到 String.equals() 不比较内存地址,但是在该代码 sn-p 中仍然创建了 3 个对象
  • 其实,如果我们不计算字面量的字符串,有6个。每个连接都会创建一个新的字符串。
  • 其实,to toUpperCase() 已经是大写的就不会创建新的字符串了,所以:4-6
【解决方案2】:

我数十:

  1. 第一条语句创建一个字符串 ("Enter a sentence :") (1)
  2. 第二条语句创建一个字符串 (mySentence) (2)
  3. 第三条语句创建2个字符串(“”原来是:“”和串联的字符串)(3,4)
  4. 第四句创建一个新字符串(然后丢弃它)(5)
  5. 第五条语句再创建 2 个 (6,7)
  6. 第六条语句再创建一个 (8)
  7. 最后的语句再创建 2 个 (9,10)

【讨论】:

  • #5 和#8 可能与#2 相同,如果mySentence 已经是大写,那么可能只有8。 --- 对于这样的问题,您通常不会考虑字符串文字被“创造”,这样就消除了#1、#3、#6和#9,所以我相信正确的答案是:4-6
【解决方案3】:

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 个对象)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多