Что подразумевается под неизменным? - PullRequest
372 голосов
/ 11 ноября 2008

Это может быть самый тупой вопрос, который когда-либо задавался, но я думаю, что это довольно запутанно для новичка в Java.

  1. Может кто-нибудь уточнить, что подразумевается под неизменным ?
  2. Почему String неизменный?
  3. Каковы преимущества / недостатки неизменяемых объектов?
  4. Почему изменяемый объект, такой как StringBuilder, должен быть предпочтительнее, чем String и наоборот?

Хороший пример (на Java) будет очень полезен.

Ответы [ 17 ]

4 голосов
/ 25 апреля 2017
String s1="Hi";
String s2=s1;
s1="Bye";

System.out.println(s2); //Hi  (if String was mutable output would be: Bye)
System.out.println(s1); //Bye

s1="Hi": объект s1 был создан со значением «Hi».

s2=s1: объект s2 создан со ссылкой на объект s1.

s1="Bye": значение предыдущего объекта s1 не изменяется, поскольку s1 имеет тип String, а тип String является неизменяемым, вместо этого компилятор создает новый объект String со значением "Bye" и ссылкой s1. к этому. здесь, когда мы печатаем значение s2, результатом будет «Привет», а не «Пока», потому что s2 ссылается на предыдущий s1 объект, который имел значение «Привет».

3 голосов
/ 11 ноября 2008

Неизменяемый означает, что после создания объекта ни один из его членов не изменится. String является неизменным, так как вы не можете изменить его содержание. Например:

String s1 = "  abc  ";
String s2 = s1.trim();

В приведенном выше коде строка s1 не изменилась, другой объект (s2) был создан с использованием s1.

3 голосов
/ 17 июля 2018

Неизменяемые просто означают неизменяемые или неизменяемые. После создания строкового объекта его данные или состояние не могут быть изменены

Рассмотрим приведенный ниже пример,

class Testimmutablestring{  
  public static void main(String args[]){  
    String s="Future";  
    s.concat(" World");//concat() method appends the string at the end  
    System.out.println(s);//will print Future because strings are immutable objects  
  }  
 }  

Давайте разберемся с приведенной ниже диаграммой,

enter image description here

На этой диаграмме вы можете видеть новый объект, созданный как "Мир Будущего". Но не меняйте «Будущее». Because String is immutable. s, все еще ссылаются на «Будущее». Если вам нужно позвонить «Мир будущего»,

String s="Future";  
s=s.concat(" World");  
System.out.println(s);//print Future World

Почему строковые объекты неизменяемы в Java?

Потому что в Java используется концепция строкового литерала. Предположим, есть 5 ссылочных переменных, все ссылаются на один объект «Будущее». Если одна ссылочная переменная изменит значение объекта, это повлияет на все ссылочные переменные. Вот почему строковые объекты неизменны в Java.

2 голосов
/ 11 ноября 2008

Однажды созданный, не может быть изменен. Рассмотрим класс, экземпляр которого может быть использован в качестве ключа для хеш-таблицы или аналогичного. Ознакомьтесь с рекомендациями по Java.

0 голосов
/ 05 июля 2017

Неизменяемые объекты

Объект считается неизменным, если его состояние не может измениться после его создания. Максимальная опора на неизменяемые объекты широко принята в качестве разумной стратегии для создания простого и надежного кода.

Неизменяемые объекты особенно полезны в параллельных приложениях. Так как они не могут изменить состояние, они не могут быть повреждены из-за помех потока или обнаружены в несогласованном состоянии.

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

Следующие подразделы берут класс, экземпляры которого являются изменяемыми, и получают класс с неизменяемыми экземплярами из него. При этом они дают общие правила для этого вида преобразования и демонстрируют некоторые преимущества неизменных объектов.

Источник

0 голосов
/ 14 июня 2018

Документы оракула говорят

Объект считается неизменным , если его состояние не может измениться после него построен Максимальная опора на неизменные объекты широко принята в качестве разумной стратегии для создания простого, надежного кода.

Неизменяемые объекты особенно полезны в параллельных приложениях. Так как они не могут изменить состояние, они не могут быть повреждены потоком помехи или наблюдаемые в несовместимом состоянии.

Мне нравится эта фраза из поста

Неизменяемые объекты упрощают параллельное программирование

0 голосов
/ 11 ноября 2008

Неизменяемый объект - это объект, который нельзя изменить после его создания. Типичным примером являются строковые литералы.

Язык программирования D, который становится все более популярным, имеет понятие «неизменность» через ключевое слово «инвариант». Прочтите статью доктора Добба об этом - http://dobbscodetalk.com/index.php?option=com_myblog&show=Invariant-Strings.html&Itemid=29. Это прекрасно объясняет проблему.

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