Сколько объектов создаст строка кода выше?
Строковый литерал представлен во время выполнения одним String
объектом. Если этот объект еще не был создан, то может быть создан (лениво) при выполнении этого оператора. В любом случае объект, представляющий литерал, будет интернирован. (Количество String
объектов, созданных в этом процессе, является подробностью реализации, которая зависит от версии Java. Да, действительно.)
new String(...)
создает объект каждый раз, когда вы его делаете.
Поскольку исходный объект String
o был интернирован, вызов intern()
вернет этот объект; то есть String
, который представляет строковый литерал: тот, с которого вы начали.
Итак, в итоге ваш код может привести к созданию до трех объектов, непосредственно и за кулисами, но объект, созданный new
, будет недоступен к концу оператора.
Действительно, с тех пор,
String a = new String("abc").intern();
и
String a = "abc";
дают идентичные результаты, последовательность new
/ intern
- пустая трата времени.
Если он создаст объект в памяти кучи, а также в памяти пула строк, то как метод intern () увеличивает производительность?
Это не напрямую увеличивает производительность:
Существует потенциальная косвенная выгода, если вы можете интернировать все строки в структуре данных. Тогда вы можете использовать ==
вместо equals(Object)
для проверки на равенство.
Однако вы торгуете со стоимостью equals
по сравнению со стоимостью, если intern
, поэтому вам нужно сделать несколько сравнений объектов, прежде чем вы получите чистый выигрыш в производительности. Кроме того, если вы забудете интернировать одну из строк, ==
может дать вам другой ответ на equals
. (Это, вероятно, ошибка!)
В старых JVM есть потенциальная косвенная выгода, если у вас много долгоживущих String
объектов. Использование intern
для дедупликации уменьшит долгосрочное использование памяти и уменьшит долгосрочные затраты на сборку мусора.
Однако в недавних JVM GC будет автоматически de-dup String
объектов, которые выдержат несколько циклов GC. Поскольку это только относится к относительно долгоживущим объектам, это более эффективный способ дедупликации. И процесс прозрачен для приложения!
Короче говоря, в большинстве случаев нет никаких преимуществ и существенных недостатков использования метода intern()
в коде приложения. Оставь это.