2012-06-25 4 views
8

Выполняется ли реализация пула памяти String Java в соответствии с шаблоном мухи?Является ли Java String Intern мухи?

Почему у меня такое сомнение, я вижу, что в Интернате нет внешнего государства. В GoF я читал, что должен быть правильный баланс между внутренним и внешним состоянием. Но в интернате все неотъемлемо.

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

Пожалуйста, помогите мне разобраться.

ответ

2

Независимо от интернирования, Java String использует шаблон мухи, разделяя char[] между строкой и данными, полученными из нее через substring и аналогичными вызовами метода. Это имеет flipside, хотя: если вы возьмете небольшую подстроку огромной струны, огромный char[] не будет иметь права на сбор мусора.

Примечание: от OpenJDK версии 1.7.0_06 выше не устарел: код был изменен так, что char[] больше не разделены между экземплярами. substring() создает новый массив.

+0

, держащий внутреннее состояние в мухомором и передающий информацию о внешнем состоянии - нам нужно беспокоиться об этом? Потому что в книге GoF я вижу большее значение для разделения внутреннего/внешнего. Здесь в char [] мухи, что является внутренним и внешним? –

+0

Это просто - 'char []' полностью внутренне, а строка, представляющая объект, является полностью внешней. Используя String, вы даже не знаете, что существует 'char []'. –

+0

Реализация HotSpot, наконец, изменяется, чтобы использовать точную длину 'char []' (или предположительно 'byte []') без полей смещения и длины. На самом деле имеет значение 'char []', так как отдельное выделение также должно быть устранено. –

4

Да, реализация String.intern() соответствует рисунку мухи.

Как javadoc говорит

Возвращает каноническое представление для строкового объекта. Пул из строк , первоначально пустой, поддерживается конфиденциально классом String.

При вызове метода intern, если пул уже содержит строку , равную этому объекту String, как определено методом equals (Object) , возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается объект String .

Из этого следует, что для любых двух строк s и t s.intern() == t.intern() истинно тогда и только тогда, когда s.equals (t) истинно.

Все литералы и строковые константные выражения - интернированные. Строковые литералы определены в §3.10.5 в Java Language Specification

интернализированный строки находятся в «Пермь Gen» пространства и строковых объектов, возвращаемых .intern() вы можете использовать оператор == потому что .intern() возвращается всегда тот же объект для равных значений.

Тогда помните, что метод .intern() не создает утечек, потому что JVM сегодня может мусор пула.

Постарайтесь прочитать это article.

+0

Но мухи - это обмениваться внутренними объектами. Interning просто кэширует все объекты. Я не вижу здесь ничего подходящего. –

+0

Мой вопрос, «делится, чтобы сохранить только память, позволяет назвать это мухи?» независимо от деталей реализации, таких как внешние/внутренние состояния. –

+0

Возможно, что я читаю неправильно, но в Википедии тоже образец возвращает и кэширует весь объект ([Flyweight pattern] (http://en.wikipedia.org/wiki/Flyweight_pattern)). Возможно, кто-то еще может прояснить шаблон. – dash1e

-1

Вес "мухи" - это обменивающийся объект внутренними элементами immmutables. Interning просто кэширует все объекты.

+0

Поскольку строки неизменяемы, я не понимаю вашу точку зрения – Mishax

0

Вы правильно определили, что как Interning, так и Flyweight основаны на той же идее: кэширование и совместное использование общего состояния. С Flyweight, в крайнем случае, когда нет встроенного состояния для хранения, нет необходимости в том, чтобы объект существовал. Остается только указатель на внешнее состояние, а затем Flyweight стал Interning.

Независимо от того, является ли интернетом «действительно» или нет, это просто дебаты над определениями. Самое главное - это понять, как можно рассматривать как специализированный экземпляр другого, так что вы хороши.

0

Как и другие, String.intern() - это все о кешировании. Он возвращает ссылку на уже сохраненный строковый литерал в пуле. Таким образом, это как-то похоже на flyweight pattern, так как использует существующие объекты, что приводит к снижению потребления памяти и увеличению производительности (хотя у статора также есть собственные служебные накладные расходы в пуле строк). Следовательно, эти два могут казаться похожими, но на самом деле их нет.

Смежные вопросы