Строка не может измениться. Но интервал, символ может измениться

Я считал, что в Java объект Строки типа не может измениться. Но международные и символьные переменные могут. Почему это? Можно ли дать мне пример?

Спасибо. (Я - более новое - _-),

12
задан Federico A. Ramponi 24 December 2009 в 02:45
поделиться

6 ответов

Как сказал Бзабхи, строки на Java неизменны. Это означает, что объект строки никогда не изменится. Это не означает, что вы не можете изменять строковые переменные, просто вы не можете изменить базовое представление строки в памяти. Например:

String str = "Hello";
str += " World!";

После выполнения этих строк, str будет указывать на новую строку в памяти. Оригинальная строка "Hello" все еще существует в памяти, но, скорее всего, долго ее там не будет. Если предположить, что нет смягчающих обстоятельств, то ничто не будет указывать на исходную строку, поэтому она будет собрана в мусор.

Я думаю, что лучшим способом сказать это было бы сказать, что когда выполняется 2-я строка примера, из конкатенуции исходной строки и добавляемой к ней строки в памяти создаётся новая строка. Переменная str, которая является просто ссылкой на ячейку в памяти, затем изменяется и указывает на только что созданную новую переменную.

Я не очень хорошо разбираюсь в этой точке, но, как я понимаю, именно это и происходит со всеми "непримитивными" значениями. Все, что в какой-то момент происходит от Object, следует этим правилам. Примитивные значения, такие как ints, bools, chars, floats и doubles позволяют изменять фактическое значение в памяти. Итак, из этого:

int num = 5;
num += 2;

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

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

.
18
ответ дан 2 December 2019 в 03:54
поделиться

Я не уверен, что можно показать (на примере), что Строки не могут измениться. Но это можно подтвердить, прочитав раздел описания Javadoc для класса String, затем прочитав раздел методов и отметив, что нет методов, которые могли бы изменить String.

EDIT: Существует множество причин, по которым Строки предназначены для неизменяемости на Java. Самая важная причина в том, что неизменяемые строки проще использовать правильно, чем мутируемые. И если вам по каким-то причинам нужен мутируемый эквивалент строки, вы можете использовать класс StringBuilder (или StringBuffer).

.
3
ответ дан 2 December 2019 в 03:54
поделиться

int и char тоже не могут измениться. Как и в случае со строками, в одну и ту же переменную можно поместить другое значение, но само целое число не меняется. 3 всегда будет 3, изменить его на 4 нельзя

.
9
ответ дан 2 December 2019 в 03:54
поделиться

Строка является неизменяемым типом (значение внутри нее не может измениться). То же самое справедливо и для всех типов примитивов (булевых, байт, чар, шорт, int, long, float и double).

int    x;
String s;

x = 1;
x = 2;
s = "hello";
s = "world";
x++; // x = x + 1;
x--; // x = x - 1;

Как видите, ни в коем случае нельзя изменить значение константы (1, 2, "привет", "мир"), но можно изменить, куда они указывают (если немного передумать и сказать, что переменная int указывает на значение константы int)

.
4
ответ дан 2 December 2019 в 03:54
поделиться

Стоит также отметить, что поскольку строки являются неизменяемыми, то если они передаются в метод, то их нельзя модифицировать внутри метода, а затем эти изменения видны за пределами области применения метода.

public void changeIt(String s) {
    // I can't do anything to s here that changes the value 
    // original string object passed into this method
} 

public void changeIt(SomeObject o) {
    // if SomeObject is mutable, I can do things to it that will 
    // be visible outside of this method call
} 
2
ответ дан 2 December 2019 в 03:54
поделиться

Эта маленькая статья, наверное, может объяснить ее лучше, чем я: http://www.jchq.net/tutorial/09_02Tut.htm

1
ответ дан 2 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: