Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.
При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.
Итак, вопрос в том, что все строки кэшируются в системе, как получается ==
возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing")
, вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString")
всегда будет возвращать false.
Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern()
вернет true.
Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.
Я выполняю определенный поток, в котором я отправляю некоторую задачу в
blockquote>Callable
и сохраняю вывод в будущемFuture<>
. В некоторых случаях я не вызываюfuture.get()
, чтобы получить значение, и я не отменю задачу. Может ли это вызвать какую-либо проблему?Нет, это не вызовет никаких проблем.
future
будет собираться мусором, пока никто не держит ссылку на него.Очевидно, что вы можете отправить
Runnable
вместоCallable
, если вам не нужны результаты из методcall()
, но он звучит для меня так же, как вы хотите программно выбрать просто забыть оCallable
, который в порядке.
В большинстве случаев, когда вы не заботитесь о результате выполнения этой задачи, это не вызовет никаких проблем.
Но обратите внимание на эту специальную функцию future.get
:
Эффекты согласованности памяти. Действия, выполняемые асинхронным вычислением, происходят до действий, следующих за соответствующим Future.get () в другом потоке.
пример:
int i = 0;
, и если вы дадите
i = 1;
в задаче, затем прочитайте
i
послеfuture.get
, он может гарантировать, что вы получите новое значение1
.Не вызывая
future.get
, вы можете получить устаревшее значение0
.