Вероятно, наиболее важная часть данных, необходимых здесь, это то, сколько времени (в процентах от процессорного времени) в настоящее время тратится на сборку мусора? Это может быть не проблема.
Если мы пойдем после этого, мы должны учитывать, что аппаратное обеспечение дурачится с памятью «за нашей спиной». Я думаю, что это будет "другая нить", на современном языке. Некоторая память может быть недоступна, если ее исследуют (может быть, она решается с помощью двухпортовой памяти), и, конечно, если HWGC собирается что-то перемещать, то ему придется блокировать другие процессы, чтобы они не мешали им. , И делайте это так, чтобы соответствовать архитектуре и используемому языку (языкам). Так что, да, для конкретного домена.
Посмотрите, что только что появилось ... в другом посте ... Глядя на журнал GC Java.
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 На самом деле это возможно изменять строки (и другие неизменяемые объекты). Он требует отражения и очень, очень опасен и никогда не должен использоваться, если вы действительно не заинтересованы в уничтожении программы.
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.
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.
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!
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.
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.
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.
Light_handle Я рекомендую вам прочитать Размер чашки - рассказ о переменных и , передаваемых по значению, пожалуйста (размер чашки, продолжение) . Это очень поможет при чтении постов выше.
Вы их читали? Да. Хороший.
String str = new String();
Это создает новый «пульт дистанционного управления» с именем « str
» и устанавливает для него значение new String ()
(или «»
).
например, в памяти это создает:
str --- > ""
str = "Hello";
Затем это изменяет пульт дистанционного управления " str
", но не изменяет исходную строку ""
.
например, в памяти это создает :
str -+ ""
+-> "Hello"
str = "Help!";
Это затем изменяет пульт дистанционного управления " str
", но не изменяет исходную строку ""
или объект, на который в настоящее время указывает пульт дистанционного управления.
например, в памяти это создает:
str -+ ""
| "Hello"
+-> "Help!"