A internação por cordas é realmente útil?

Estive conversando sobre strings e vários idiomas há algum tempo, e o tópicostring interning veio. Aparentemente, o Java e o .NET framework fazem isso automaticamente com todas as strings, além de várias linguagens de script. Teoricamente, economiza memória porque você não acaba com várias cópias da mesma string e economiza tempo, porque as comparações de igualdade de string são uma comparação simples de ponteiro em vez de uma O (N) percorrer cada caractere da string.

Mas quanto mais eu penso sobre isso, mais cético fico em relação aos benefícios do conceito. Parece-me que as vantagens são principalmente teóricas:

Primeiro, para usar a internação automática de strings, todas as strings devem ser imutáveis, o que dificulta muitas tarefas de processamento de strings do que precisam. (E sim, ouvi todos os argumentos a favor da imutabilidade em geral. Esse não é o ponto.) Toda vez que uma nova string é criada, ela deve ser verificada na tabela interna de strings, que é pelo menos uma operação O (N). EDITAR Onde N é o tamanho da string, não o tamanho da tabela, pois isso confunde as pessoas.) Portanto, a menos que a proporção de comparações de igualdade de strings com a criação de novas strings seja bastante alta, é improvável que o tempo líquido economizado seja positivo valor Se a tabela de igualdade de cadeias usar referências fortes, as cadeias nunca serão coletadas como lixo quando não forem mais necessárias, desperdiçando memória. Por outro lado, se a tabela usar referências fracas, a classe de sequência exigirá algum tipo de finalizador para remover a sequência da tabela, tornando o processo de GC mais lento. (O que pode ser bastante significativo, dependendo de como a tabela interna de cadeias de caracteres é implementada. Na pior das hipóteses, a exclusão de um item de uma tabela de hash pode exigir uma reconstrução O (N) de toda a tabela em determinadas circunstâncias.)

Este é apenas o resultado de eu pensar nos detalhes da implementação. Há algo que eu perdi? O internamento de strings realmente oferece benefícios significativos no caso geral?

EDIT 2: Tudo bem, aparentemente eu estava operando com uma premissa equivocada. A pessoa com quem eu estava conversando nunca apontou que o internamento de strings era opcional para as strings recém-criadas e, de fato, dava a forte impressão de que o oposto era verdadeiro. Obrigado a Jon por esclarecer a questão. Outra resposta aceita para el

questionAnswers(7)

yourAnswerToTheQuestion