2015-02-24 47 views
3
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字符串?

+1

字符串在Java中是不可变的,所以's.toLowerCase()'返回一个新的String对象。 – Ocracoke 2015-02-24 16:14:22

+4

@Ocracoke - 没有。他不会重新分配由'concat'返回的值,所以s将是“java”,然后是“java”,toLowerCase()'将返回相同的字符串“java” – TheLostMind 2015-02-24 16:23:31

+0

@TheLostMind啊,只是看着代码对于'toLowerCase()'来说,当它发现什么都不做时,就会看到'return this'这行。我的错。 – Ocracoke 2015-02-24 16:37:09

回答

5

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) 
+2

步骤3中返回的对象是否有对两个字符串的引用,所以这就是为什么它不会自己计算为字符串? – 2015-02-24 16:29:14

+0

@SotiriosDelimanolis - 我的意思是一样的。由于字符串中没有大写字符,因此将返回相同的字符串。编辑答案使其更清晰。 :) – TheLostMind 2015-02-25 06:04:03

5

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

+0

这些行数不是我如何计算对象的! – user1529412 2015-02-24 16:21:18