2015-02-24 2 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» уже существует в пуле строковых констант, поэтому зачем ее создавать снова?Сколько строк Java создано?

+1

Строки неизменны в Java, поэтому 's.toLowerCase()' возвращает новый объект String. – Ocracoke

+4

@ Ocracoke - Nope. Он не переустанавливает значение, возвращаемое 'concat', поэтому s будет« java », а затем« java », toLowerCase()' вернет ту же строку «java» – TheLostMind

+0

@TheLostMind Ah, просто посмотрел код для 'toLowerCase()' и видел, что в нем есть строка 'return this', когда он не находит ничего общего. Виноват. – Ocracoke

ответ

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, ссылки на обе строки, поэтому он не считается самой строкой? –

+0

@SotiriosDelimanolis - Я имел в виду то же самое. Тот же String будет возвращен, поскольку в строке нет прописных букв. Отредактировал андре, чтобы сделать его более ясным. :) – TheLostMind

5

Java знает, что строка «java» уже существует в постоянном пуле, поэтому ему не нужно снова создавать объект?

На самом деле, это не "java" строка, которая существует в бассейне, но "Java" (в верхнем регистре). Если бы это действительно было "java", toLowerCase() бы узнал его и вернул исходную строку. Но так как возвращаемое значение (т.е. "java" в нижнем регистре) не совпадает с исходной строки (т.е. "Java" в смешанном регистре) новый объект String должен быть создан, в результате чего количество до 4.

Edit: После отредактируйте вопрос, ответ изменится: теперь, когда вы изменили "Java" на "java", количество создаваемых объектов равно трем, потому что Java String имеет оптимизацию, которая возвращает исходную строку из toLowerCase, когда строка уже находится в нижнем регистре. Итак, строка 1 создает один строковый объект "java", строка 2 создает два строковых объекта " SE 6" и "java SE 6", а строки 3 и 4 не создают никаких дополнительных объектов.

+0

Это номера строк, не так, как я подсчитал объекты! – user1529412

Смежные вопросы