Действительно ли интернирование строк полезно?

Некоторое время назад я разговаривал о строках и различных языках, и возникла тема интернирования строк . Очевидно, Java и .NET framework делают это автоматически со всеми строками, а также с несколькими языками сценариев. Теоретически это экономит память, потому что вы не получаете несколько копий одной и той же строки,и это экономит время, потому что сравнение строк на равенство - это простое сравнение указателей, а не O (N), проходящее через каждый символ строки.

Но чем больше я думаю об этом, тем более скептически отношусь к преимуществам этой концепции. Мне кажется, что преимущества в основном теоретические:

  • Во-первых, для использования автоматического интернирования строк все строки должны быть неизменяемыми, что усложняет выполнение множества задач обработки строк, чем они должны быть. (И да, я слышал все аргументы в пользу неизменности в целом. Дело не в этом.)
  • Каждый раз, когда создается новая строка, ее нужно проверять по таблице интернирования строк, которая, по крайней мере, равна O (N) операция. ( РЕДАКТИРОВАТЬ: Где N - размер строки, а не размер таблицы, так как это сбивало людей с толку.) Таким образом, если соотношение сравнений равенства строк к созданию новой строки не будет довольно высоким, это маловероятно что сэкономленное чистое время является положительным значением.
  • Если таблица равенства строк использует строгие ссылки, строки никогда не будут собираться сборщиком мусора, когда они больше не нужны, что приводит к потере памяти. С другой стороны, если в таблице используются слабые ссылки, то классу строки требуется какой-то финализатор для удаления строки из таблицы, что замедляет процесс сборки мусора. (Что может быть весьма значительным, в зависимости от того, как реализована внутренняя таблица строк. В худшем случае удаление элемента из хеш-таблицы может потребовать O (N) перестроения всей таблицы при определенных обстоятельствах.)

Это просто результат моих размышлений о деталях реализации. Я что-то пропустил? Действительно ли интернирование строк дает какие-либо существенные преимущества в общем случае?

РЕДАКТИРОВАТЬ 2: Хорошо, очевидно, я действовал из ошибочной предпосылки. Человек, с которым я разговаривал, никогда не указывал, что интернирование струн необязательно для вновь созданных струн, и на самом деле производил сильное впечатление, что верно обратное. Спасибо Джону за то, что все разъяснил. Еще один принятый ответ для него.

21
задан Mason Wheeler 11 July 2011 в 18:19
поделиться