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 не создают никаких дополнительных объектов.
Строки неизменны в Java, поэтому 's.toLowerCase()' возвращает новый объект String. – Ocracoke
@ Ocracoke - Nope. Он не переустанавливает значение, возвращаемое 'concat', поэтому s будет« java », а затем« java », toLowerCase()' вернет ту же строку «java» – TheLostMind
@TheLostMind Ah, просто посмотрел код для 'toLowerCase()' и видел, что в нем есть строка 'return this', когда он не находит ничего общего. Виноват. – Ocracoke