2013-08-06 5 views
1

в Java, я создал 2 строковых литералов, имеющих одинаковое значениекак Java обрабатывает строковые литералы

String a = "Hello"; 
String b = "Hello"; 

теперь оба они должны иметь ту же ссылку

System.out.println(a==n); // returns true 

, но когда я делаю

b+=" World"; 
System.out.println(a==b); // returns false 

Теперь у меня есть 2 вопроса
1. почему a и b не ссылаются на тот же объект после операции «b + =»? 2. как же я в состоянии изменить строку б без ошибок? (Потому что я прочитал класс Строка неизменен)

+5

Этот вопрос задан и ответил сотни раз на SO. Пожалуйста, сначала ищите. –

+1

[Как инициализировать строку с помощью «»?] (Http://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410) –

+0

Возможный дубликат [Java String Pool] (http://stackoverflow.com/questions/2486191/java-string-pool) или действительно [Как сравнить строки в Java] (http://stackoverflow.com/questions/513832/how-do- i-compare-strings-in-java) среди * multiple * others. –

ответ

4

Причины вы можете изменить b потому, что вы технически сделать новый объект String, и назначение его к существующей ссылке.

b += " World" 

такая же, как

b = b + " World"; 

b технически указывает на новый объект String. Итак, чтобы начать, a и b указывают на один и тот же объект, но когда изменяется b, теперь это другой объект, поэтому a не будет равен "Hello World" и a==b теперь будет ложным.

Для примеров изменяемых классов строк попробуйте StringBuffer или StringBuilder. Вы можете использовать их метод .append() для добавления в строку вместе с другими методами для ее изменения.

2
  1. Когда вы b+=" World" вы создаете новый экземпляр строки, конечно, это делает больше не указывать на одну и ту же старую строку.

  2. Вы не меняете старую строку, вместо этого вы создаете новую строку и присваиваете ее переменной b. Используйте модификатор final, если вы хотите всегда ссылаться на тот же объект с этой переменной.

0
  1. а и Ь указывает на объект String. Изменение b означает, что вы теперь указываете на новый объект.

  2. Поскольку строки «неизменяемы», когда вы «модифицируете» строку, создается новый объект. Вот почему второе уже не то же самое.

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