string + something
создает новый String
, поэтому исходный String
не изменяется (он должен быть неизменным), и новый неизменный String
создается с включенным новым персонажемконец этого.
Так вот почему троичный оператор работает нормально.Он создаст один или другой новый String
по обе стороны от :
(в зависимости от условия до ?
) и вернет вам тот, который он создал.
Ошибкас кодом, который вы дали мне по-другому, поэтому я не уверен:
error: not a statement
testStr + "example";
^
Я думаю, вы могли иметь в виду это:
String testStr = "test";
testStr += "example";
Это компилируется.Причина в том, что объект "test"
является неизменным, но не является переменной testStr
.Если переменная не помечена final
вами, вы можете сделать так, чтобы переменная позже ссылалась на другой объект.
Это немного похоже на стирание адреса из конверта и запись другого адреса.Вы ничего не изменили в доме по этому адресу (вы не мутировали в доме).Вы только что изменили дом, на который ссылаетесь (вы только что мутировали конверт, который относится к дому).
Сначала testStr
относится к "test"
.Позже это относится к "testexample"
.Старый неизменный "test"
все еще там, пока не будет собран мусор.Это не изменилось.Был создан совершенно новый String
, и теперь переменная, которая не является неизменной, ссылается на новую неизменяемую String
.