Неизменность строк - PullRequest
       5

Неизменность строк

2 голосов
/ 21 сентября 2011

Мне сказали, что строки в java нельзя изменить. Как насчет следующего кода?

name="name";
name=name.replace('a', 'i');

Разве это не меняет name строку?Также, где находится реализация replace ();сравнить с();равна ();предоставлена?Я просто использую эти функции здесь, но где на самом деле они реализованы?

Ответы [ 4 ]

6 голосов
/ 21 сентября 2011

String.replace () возвращает новую строку.

«name» - это ссылка на объект String, поэтому его можно переназначить для указания на name.replace (), но он будет указывать на новый объект.

Вот javadoc для String , где вы можете узнать, что делают все методы.

1 голос
/ 21 сентября 2011

Это классический случай смешения ссылочной переменной (имени) с объектом String, на который она ссылается («имя»).Это два совершенно разных зверя.String никогда не изменяется (игнорируя ключи типа отражения), но ссылочная переменная может ссылаться на столько разных строк, сколько необходимо.Вы заметите, что если вы только что позвонили

name.replace('a', 'i');

, ничего не произойдет.Изменение можно увидеть только в том случае, если ваша переменная имени назначена другой строке, возвращаемой методом replace.

0 голосов
/ 07 апреля 2014

Если ваш код name="name"; name.replace('a', 'i'); //assignment to String variable name is neglected System.out.print(name)

, то выведите: name

это потому, что name.replace('a','i') поместил бы замененную строку, nime в пул строк, носсылка не указана на имя строковой переменной.

Всякий раз, когда вы пытаетесь изменить строковый объект, проверяет Java, является ли результирующая строка доступной в пуле строк , если доступна ссылка на доступныйстрока указывает на строковую переменную , иначе в строковом пуле создается новый строковый объект, а ссылка на созданный объект указывается на строковую переменную.

0 голосов
/ 21 сентября 2011

Попробуйте и убедитесь сами:

String name = "name";
String r    = name.replace( 'a', 'i' );
System.out.println( name );// not changed 
System.out.println( r    ); // new, different string 

Если вы назначите новую ссылку на r, исходный объект не изменится.

Надеюсь, это поможет.

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