创建了多少个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行不创建任何其他对象。