Неизменность строк в Java

Вероятно, наиболее важная часть данных, необходимых здесь, это то, сколько времени (в процентах от процессорного времени) в настоящее время тратится на сборку мусора? Это может быть не проблема.

Если мы пойдем после этого, мы должны учитывать, что аппаратное обеспечение дурачится с памятью «за нашей спиной». Я думаю, что это будет "другая нить", на современном языке. Некоторая память может быть недоступна, если ее исследуют (может быть, она решается с помощью двухпортовой памяти), и, конечно, если HWGC собирается что-то перемещать, то ему придется блокировать другие процессы, чтобы они не мешали им. , И делайте это так, чтобы соответствовать архитектуре и используемому языку (языкам). Так что, да, для конкретного домена.

Посмотрите, что только что появилось ... в другом посте ... Глядя на журнал GC Java.

211
задан Gnark 23 March 2014 в 21:58
поделиться

8 ответов

str не объект, это ссылка на объект. «Привет» и «Помогите!» - это два разных объекта String . Таким образом, str указывает на строку. Вы можете изменить то, что он указывает на , но не то, что он указывает на .

Возьмем этот код, например:

String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"

Теперь мы не можем сделать ничего 1 с s1 , что повлияло бы на значение s2 . Они относятся к одному и тому же объекту - строке «Hello» , но этот объект неизменен и, следовательно, не может быть изменен.

Если мы сделаем что-то вроде этого:

s1 = "Help!";
System.out.println(s2); // still prints "Hello"

Здесь мы увидим разницу между изменением объекта и изменением ссылки. s2 по-прежнему указывает на тот же объект, на который мы изначально установили s1 . Установка s1 на «Помощь!» изменяет только ссылку , в то время как объект String , на который он первоначально ссылался, остается неизменным.

Если бы строки были изменяемыми, мы могли бы сделать что-то вроде этого:

String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"

Edit, чтобы ответить на редактирование OP:

Если вы посмотрите исходный код для String.replace (char, char) (также доступный в src.zip в каталоге установки JDK), советуем заглядывать туда всякий раз, когда вам интересно, как что-то действительно работает) вы можете видеть, что он делает следующее:

  • Если есть одно или несколько вхождений oldChar в текущей строке, сделайте копию текущей строки, где все вхождения oldChar заменяются на newChar .
  • Если oldChar отсутствует в текущей строке, вернуть текущую строку.

Итак, да, «Миссисипи» .replace ('i', '!') создает новый объект String . Опять же, верно следующее:

String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects

Ваша домашняя задача сейчас - посмотреть, что сделает приведенный выше код, если вы измените s1 = s1. replace ('i', '!'); на s1 = s1.replace ('Q', '!'); :)


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

298
ответ дан 23 November 2019 в 04:33
поделиться

Though java tries to ignore it, str is nothing more than a pointer. This means that when you first write str = "Hello";, you create an object that str points to. When you reassign str by writing str = "Help!";, a new object is created and the old "Hello" object gets garbage collected whenever java feels like it.

4
ответ дан 23 November 2019 в 04:33
поделиться

Immutability implies that the value of an instantiated object cannot change, you can never turn "Hello" into "Help!".

The variable str is a reference to an object, when you assign a new value to str you aren't changing the value of the object it references, you are referencing a different object.

3
ответ дан 23 November 2019 в 04:33
поделиться

Regarding the replace part of your question, try this:

String str = "Mississippi"; 
System.out.println(str); //Prints Mississippi 

String other = str.replace("i", "!"); 
System.out.println(str); //still prints Mississippi 
System.out.println(other);  // prints M!ss!ss!pp!
5
ответ дан 23 November 2019 в 04:33
поделиться

The String will not change, the reference to it will. You are confusing immutability with the concept of final fields. If a field is declared as final, once it has been assigned, it cannot be reassigned.

5
ответ дан 23 November 2019 в 04:33
поделиться

The string object that was first referenced by str was not altered, all that you did was make str refer to a new string object.

6
ответ дан 23 November 2019 в 04:33
поделиться

The object that str references can change, but the actual String objects themselves cannot.

The String objects containing the string "Hello" and "Help!" cannot change their values, hence they are immutable.

The immutability of String objects does not mean that the references pointing to the object cannot change.

One way that one can prevent the str reference from changing is to declare it as final:

final String STR = "Hello";

Now, trying to assign another String to STR will cause a compile error.

23
ответ дан 23 November 2019 в 04:33
поделиться

Light_handle Я рекомендую вам прочитать Размер чашки - рассказ о переменных и , передаваемых по значению, пожалуйста (размер чашки, продолжение) . Это очень поможет при чтении постов выше.

Вы их читали? Да. Хороший.

String str = new String();

Это создает новый «пульт дистанционного управления» с именем « str » и устанавливает для него значение new String () (или «» ).

например, в памяти это создает:

str --- > ""

str  = "Hello";

Затем это изменяет пульт дистанционного управления " str ", но не изменяет исходную строку "" .

например, в памяти это создает :

str -+   ""
     +-> "Hello"

str = "Help!";

Это затем изменяет пульт дистанционного управления " str ", но не изменяет исходную строку "" или объект, на который в настоящее время указывает пульт дистанционного управления.

например, в памяти это создает:

str -+   ""
     |   "Hello"
     +-> "Help!"
10
ответ дан 23 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

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