Стажировка - это то, что происходит за кулисами, поэтому вам, как программисту, никогда не придется беспокоиться об этом.Как правило, вам не нужно ничего класть в бассейн или получать что-либо из пула.Как сборка мусора: вам никогда не придется вызывать его, или беспокоиться о том, что это может произойти, или беспокоиться о том, что это может не произойти.(Ну, в 99,999% случаев. А оставшиеся 0,001 процента - это когда вы делаете очень странные вещи.)
Компилятор заботится о интернировании всех строковых литералов, содержащихся в вашем исходном файле, поэтому "Лалала "будет интернирована без необходимости что-либо делать или контролировать ситуацию.И всякий раз, когда вы ссылаетесь на «lalala» в своей программе, компилятор обязательно выбирает ее из внутреннего пула, опять же, без необходимости что-либо делать и не иметь никакого контроля над этим вопросом.
Внутренний пул содержитболее или менее фиксированное количество строк, как правило, очень маленького размера (только часть общего размера вашего .exe), поэтому не имеет значения, что они никогда не будут собирать мусор.
EDIT
Цель интернирования строк - значительно улучшить время выполнения некоторых строковых операций, таких как Equals ().Метод Equals()
String
сначала проверяет, равны ли строки по ссылке, что очень быстро;если ссылки равны, то немедленно возвращается true
;если ссылки не равны, и обе строки интернированы, то он немедленно возвращает false
, поскольку они не могут быть равны, поскольку все строки в пуле интернирования отличаются друг от друга.Если ничего из вышеперечисленного не выполняется, тогда выполняется последовательное сравнение строк за символом.(На самом деле, это даже сложнее, потому что он также проверяет хеш-коды строк, но в этом обсуждении все будет просто.)
Итак, предположим, что вы читаете токены из файла в строкеs
, и у вас есть оператор switch следующего вида:
switch( s )
{
case "cat": ....
case "dog": ....
case "tod": ....
}
Строковые литералы "cat", "dog", "tod" все интернированы, но вы сравниваете каждый из ниходин из них против s
, который не был интернирован, так что вы не пожинаете плоды стажировки.Если вы интернируете s
прямо перед оператором switch, то сравнения, которые будут выполняться оператором switch, будут выполняться намного быстрее.
Конечно, если есть вероятность, что ваш файл может содержать мусор,тогда вы НЕ хотите этого делать, потому что загрузка большого количества случайных строк в пул интернационала наверняка снизит производительность вашей программы и в конечном итоге исчерпает память.