У меня был разговор о строках и разных языках, и тема string interning появилась. Очевидно, что Java и .NET framework делают это автоматически со всеми строками, а также с несколькими языками сценариев. Теоретически это экономит память, потому что у вас нет нескольких копий одной и той же строки, и это экономит время, потому что сравнение равенства строк - это простое сравнение указателей вместо O (N), проходящее через каждый символ строки.
Но чем больше я думаю об этом, тем более скептически я выражаю преимущества концепции. Мне кажется, что преимущества в основном теоретические:
- Во-первых, чтобы использовать автоматическую интерполяцию строк, все строки должны быть неизменными, что значительно затрудняет выполнение задач строковой обработки, чем они должны быть. (И да, я слышал все аргументы в пользу неизменности вообще. Это не главное.)
- Каждый раз, когда создается новая строка, она должна быть проверена на основе таблицы интерполяции строк, которая является, по меньшей мере, операцией O (N). ( EDIT:. Где N - размер строки, а не размер таблицы, так как это путало людей). Поэтому, если соотношение между сравнением равенства строк с созданием новой строки довольно велико, маловероятно, что чистая экономия времени будет положительной.
- Если таблица равенства строк использует сильные ссылки, строки никогда не получат сбор мусора, когда они больше не нужны, тем самым теряя память. С другой стороны, если таблица использует слабые ссылки, то для строкового класса требуется какой-то финализатор для удаления строки из таблицы, что замедляет процесс GC. (Что может быть довольно значительным, в зависимости от того, как реализована статическая таблица строк. В худшем случае удаление элемента из хэш-таблицы может потребовать O (N) перестройки всей таблицы при определенных обстоятельствах.)
Это только результат того, что я думаю о деталях реализации. Есть что-то, что я пропустил? Действительно ли интернирование строк действительно дает какие-либо существенные преимущества в общем случае?
РЕДАКТИРОВАТЬ 2: Хорошо, видимо, я работал из ошибочной посылки. Человек, с которым я разговаривал, никогда не указывал, что интернирование строк необязательно для вновь созданных строк, и на самом деле произвело сильное впечатление, что противоположное было правдой. Спасибо Джону за то, что он задал вопрос прямо. Другой принятый для него ответ.