创建了多少个Java字符串?

public static void main(String [] args){ String s = "java"; //line 1 s.concat(" SE 6"); //line 2 s.toLowerCase(); //line 3 System.out.print(s); //line 4 } 

这个问题的答案是“4”。 我以为它会是“3”。 我的困惑是第3行,它再次创建了“java”字符串,但是java不知道字符串常量池中已经存在“java”字符串,那么为什么要再创建它呢?

创建了3个Java字符串。

 1. "java" -> Goes into String constants pool // will be added if no already present 2. " SE 6" --> Goes into String constants pool? 3. java SE 6 --> Goes on heap (call to concat)// Note : You are not re-assinging the value returned from concat() So s will still be "java" ** toLowerCase() \\ does nothing in your case since "java" is already present. toLowerCase retruns the same "java" object ( as there is no modification required to turn it into lowercase) 

Java知道“java”字符串已经存在于常量池中,所以它不需要再次创建对象吗?

实际上,它不是池中存在的"java"字符串,而是"Java" (大写)。 如果它确实是"java"toLowerCase()会识别它,并返回原始字符串。 但由于返回值(即全部小写的"java" )与原始字符串(即大小写混合的"Java" )不匹配,因此需要创建一个新的String对象,使计数为4。

编辑:在对问题进行编辑后,答案发生了变化:既然您已将"Java"更改为"java" ,则创建的对象数量为3,因为Java String具有从toLowerCase返回原始字符串的优化该字符串已经是小写的。 因此第1行创建一个字符串对象"java" ,第2行创建两个字符串对象" SE 6""java SE 6" ,第3行和第4行不创建任何其他对象。