Добавьте макрос ниже в визуальную студию.
http://visualstudiomacros.blogspot.com/2008/03/getting-ctrl-right-arrow-to-respect.html
Интернирование может быть очень полезным, если у вас есть строки N
, которые может принимать только K
различных значений, где N
намного превышает K
. Теперь вместо хранения N
строк в памяти вы будете хранить только до K
.
Например, у вас может быть тип ID
, который состоит из 5 цифр. Таким образом, может быть только 10 ^ 5
разных значений. Предположим, вы сейчас разбираете большой документ, в котором есть много ссылок / перекрестных ссылок на значения ID
. Допустим, в этом документе всего 10 ^ 9
ссылок (очевидно, что некоторые ссылки повторяются в других частях документа).
Итак, N = 10 ^ 9
и K = 10 ^ 5
в этом случае. Если вы не интернируете строки, вы сохраните в памяти 10 ^ 9
строк, где многие из этих строк равны
(по Принципу голубятни ). Если вы intern ()
строка ID
получаете при синтаксическом анализе документа, и вы не сохраняете никаких ссылок на неинтернированные строки, которые вы читаете из документа (так что они можно собирать мусор), то вам никогда не понадобится хранить в памяти более 10 ^ 5
строк.
Примеры, когда интернирование будет полезным, включают строки с большим числом, где:
Типичные примеры включают разбиение / анализ текста на символы (слова, идентификаторы, URI) и последующее присоединение этих символов к долгоживущим структурам данных. Обработка XML, компиляция языков программирования и тройные хранилища RDF / OWL приходят на ум как приложения, в которых интернирование может оказаться полезным.
Но интернирование не обходится без проблем, особенно если выясняется, что вышеприведенные предположения неверны:
Наконец, интернирование потенциально увеличивает накладные расходы сборщика мусора за счет увеличения количества объектов, которые необходимо отслеживать и копировать, и за счет увеличения количества слабых ссылок, которые необходимо обрабатывать. Это увеличение накладных расходов должно быть уравновешено уменьшением накладных расходов сборщика мусора в результате эффективного интернирования.
Не полный ответ, а дополнительная пища для размышлений ( здесь ):
Таким образом, основное преимущество в в данном случае использование оператора
==
для интернализованных строк намного быстрее, чем использование методаequals ()
[для неинтернализованных строк]. Итак, используйте методintern ()
, если вы собираетесь сравнивать строки более одного или трех раз.
Никогда, никогда, не используйте intern на данных, предоставленных пользователем, так как это может вызвать атаки отказа в обслуживании (поскольку строки, обработанные intern()ed, никогда не освобождаются). Вы можете выполнить проверку на предоставленных пользователем строках, но тогда вы уже выполнили большую часть работы, необходимой для intern().
У нас была производственная система, которая обрабатывает буквально миллионы единиц данных одновременно, многие из которых имеют строковые поля. Мы должны были интернировать строки, но была ошибка, из-за которой мы этого не делали. Исправив ошибку, мы избежали необходимости делать очень дорогостоящее (по крайней мере, 6 цифр, возможно, 7) обновление сервера.