Строка не может измениться. Но int, char может измениться - PullRequest
12 голосов
/ 24 декабря 2009

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

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

Ответы [ 7 ]

18 голосов
/ 24 декабря 2009

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

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

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

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

Я не особо осведомлен в этом вопросе, но, насколько я понимаю, это то, что происходит со всеми "не примитивными" ценностями. Все, что в какой-то момент происходит от Объекта, следует этим правилам. Примитивные значения, такие как int, bools, chars, float и double, позволяют изменять действительное значение в памяти. Итак, из этого:

int num = 5;
num += 2;

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

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

9 голосов
/ 24 декабря 2009

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

4 голосов
/ 24 декабря 2009

String является неизменяемым типом (значение внутри него не может быть изменено). То же самое верно для всех примитивных типов (булево, байтовое, char, short, 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).

3 голосов
/ 24 декабря 2009

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

РЕДАКТИРОВАТЬ : Есть много причин, по которым строки предназначены для неизменяемости в Java. Наиболее важной причиной является то, что неизменяемые строки проще использовать правильно, чем изменяемые. И если по какой-то причине вам нужен изменчивый эквивалент String, вы можете использовать класс StringBuilder (или StringBuffer).

2 голосов
/ 24 декабря 2009

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

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
} 
1 голос
/ 03 апреля 2012

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

Однако StringBuffer является изменяемым, то есть его можно изменять в памяти (новый блок памяти не должен выделяться), что делает его довольно эффективным. Также рассмотрим следующий пример:

StringBuffer mystringbuffer = new StringBuffer(5000);

for (int i = 0; i<=1000; i++)
{
    mystringbuffer.append ( 'Number ' + i + '\n');
}

System.out.print (mystringbuffer);

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

Хотя StringBuffer не повысит эффективность в каждой ситуации, если ваше приложение использует строки, длина которых растет, это будет эффективно. Код также может быть понятнее с StringBuffer s, потому что метод добавления избавляет вас от необходимости использовать длинные операторы присваивания.

1 голос
/ 24 декабря 2009

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

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