Что означает неизменяемость?

Если строка неизменна, значит ли это, что.... (допустим, JavaScript)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

Означает ли это, что при вызове методов в строке он вернет измененную строку, но не изменит исходную строку?

Если строка была изменчивой, означает ли это, что второй alert() вернет oo?

Ответ 1

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

Означает ли это, когда вы вызываете методы на строка, она вернет измененную string, но это не изменит начальная строка?

Да. Ничто не может изменить строку после ее создания. Теперь это не означает, что вы не можете назначить новый строковый объект переменной str. Вы просто не можете изменить текущий объект, на который ссылается str.

Если строка была изменчивой, означает, что второе предупреждение() вернется также?

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

Ответ 2

На более низком уровне неизменность означает, что память, в которой хранится строка, не будет изменена. После создания строки "foo" выделяется некоторая память для хранения значения "foo". Эта память не будет изменена. Если вы изменяете строку с помощью, скажем, substr(1), создается новая строка и выделяется другая часть памяти, которая будет хранить "oo". Теперь у вас две строки в памяти, "foo" и "oo". Даже если вы больше не собираетесь использовать "foo", он будет придерживаться, пока не будет собран мусор.

Одна из причин, по которой строковые операции сравнительно дороги.

Ответ 3

Неизменяемый означает то, что нельзя изменить или изменить.

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

Ответ 4

Я не уверен в JavaScript, но в Java строки добавляют дополнительный шаг к неизменяемости с помощью "String Constant Pool". Строки могут быть построены со строковыми литералами ("foo") или с конструктором класса String. Строки, построенные со строковыми литералами, являются частью пула константных строк, и тот же строковый литерал всегда будет одним и тем же адресом памяти из пула.

Пример:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

В приведенном выше примере оба lit1 и lit2 построены с использованием одного и того же строкового литерала, поэтому они указывают на один и тот же адрес памяти; lit1 == lit2 приводит к true, потому что это точно тот же объект.

Однако cons создается с использованием конструктора класса. Хотя параметр является одной и той же строковой константой, конструктор выделяет новую память для cons, то есть cons - это не тот же объект, что и lit1 и lit2, несмотря на то, что они содержат одни и те же данные.

Конечно, поскольку все три строки содержат одни и те же символьные данные, метод equals возвращает true.

(Оба типа строковой конструкции, конечно, неизменяемы)

Ответ 5

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

Использование StringBuffer при управлении строками вместо этого делает операцию более эффективной, поскольку StringBuffer хранит строку в массиве символов с переменными для хранения емкости массива символов и длины массива (String в форме массива char)

Ответ 6

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

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

var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);

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

Строки - это не единственные неизменные значения, встроенные в JavaScript. Номера тоже неизменяемы. Можете ли вы представить себе среду, в которой оценка выражения 2 + 3 изменяет значение числа 2? Это звучит абсурдно, но мы делаем это с нашими объектами и массивами все время.

Ответ 7

Из строк в стопки... простой для понимания пример, взятый из Блог Эрика Липперта:

Поиск путей с использованием A * в С# 3.0, часть вторая...

Изменчивый стек, такой как System.Collections.Generic.Stack явно не подходит. Мы хотим быть в состоянии принять существующий путь и создавать новые пути от него для всех соседи последнего элемента, но нажав новый node на стандартный стек модифицирует стек. Ср должен сделать копии стека прежде чем надавить, что глупо потому что тогда wed дублирует все его содержимого без необходимости.

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

Чтобы углубляться в непостоянство, прочитайте сообщения Eric, начиная с этого:

Неизменность в С# Часть первая: Виды неизменности

Ответ 8

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