Неизменность строки - (конкат и присвоение нового значения) - PullRequest
1 голос
/ 23 сентября 2019

У меня есть вопрос об неизменности String, а именно: в первой ситуации имя переменной не меняется.

String name = "Unknown" ;  
name.concat("Boy"); 

System.out.println (name); 

Но во втором случае переменная меняет свое значение.

String name = "Unknown" ;  
System.out.println (name); 

name = "Test";
System.out.println(name);

Почему переменная изменяется не в первом случае, а во втором случае в максимально возможной степени?

Ответы [ 3 ]

3 голосов
/ 23 сентября 2019

Строки неизменны - они не меняются.

Переменная name указывает на строку "Unknown"

Если вы посмотрите на документы для String найдено здесь , вы увидите, что concat() возвращает String, который является новым String, который объединяет "Unknown" с "Boy".

Переменная name по-прежнему указывает на строку "Unknown".

Чтобы изменить имя, вам нужно переназначить его на String, возвращаемое concat:

name = name.concat("Boy");

Во втором примере вы переназначаете ссылку на "Test".

Ни одна из строк не изменилась, только ссылки.

2 голосов
/ 23 сентября 2019

Похоже, вы запутались между reference variable и Object, в вашем случае name - это reference variable типа String, который может содержать ссылку на объект String.Пожалуйста, пройдите this для понимания ссылки, переменной и объекта.

В вашем первом случае name - это переменная, которая содержит ссылку на строковый объект "Unkown" и когдаname.concat("Boy") будет создан новый объект String ("UnkownBoy"), но переменная name по-прежнему содержит ссылку на старый объект ("Unkown"), поскольку вы нигде не обновляли ссылку в первом случае.

Во втором случае вы обновили ссылочную переменную на name = "Test";, это означает, что теперь name будет содержать ссылку на новый объект String "Test".

2 голосов
/ 23 сентября 2019

Вот как работает конкатнация строк.Он не соответствует вашей существующей строке, но создает новую.

String name = "Unknown" ;  
name.concat("Boy"); 

Это создает и возвращает новую строку "UnknownBoy", которую вы не сохраняете.Обратитесь к String API, чтобы узнать, как метод ведет себя.https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#concat-java.lang.String-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...