Когда использовать интерн () на Строковых литералах

Если Вы хотите отбросить все процедуры в DB -

SELECT  IDENTITY ( int, 1, 1 ) id, 
        [name] 
INTO    #tmp 
FROM    sys.procedures 
WHERE   [type]        = 'P' 
    AND is_ms_shipped = 0 

DECLARE @i INT 

SELECT   @i = COUNT( id ) FROM #tmp 
WHILE    @i > 0 
BEGIN 
   DECLARE @name VARCHAR( 100 ) 
   SELECT @name = name FROM #tmp WHERE id = @i 
   EXEC ( 'DROP PROCEDURE ' + @name ) 
   SET @i = @i-1 
END

DROP TABLE #tmp
37
задан Raedwald 22 August 2013 в 07:25
поделиться

3 ответа

Это метод, гарантирующий, что CONSTANT на самом деле не является константой.

Когда компилятор Java видит ссылку на последний статический примитив или String, он вставляет фактическое значение этой константы в класс, который ее использует. Если вы затем измените постоянное значение в определяющем классе, но не перекомпилируете использующий класс, он продолжит использовать старое значение.

Вызов intern () для «константной» строки больше не считается статическая константа компилятором, поэтому используемый класс будет фактически обращаться к члену определяющего класса при каждом использовании.


Цитаты JLS:

68
ответ дан 27 November 2019 в 04:20
поделиться

Использование intern () с константным строковым литералом является пустая трата времени, поскольку литерал уже будет интернирован, как указано в разделе 3.10.5. Строковые литералы из Спецификация языка Java® .

Цитата из Java SE 8 Edition:

Более того, строковый литерал всегда относится к одному и тому же экземпляру класса String. Это связано с тем, что строковые литералы - или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28) - «интернированы», чтобы совместно использовать уникальные экземпляры, используя метод String.intern.

Я полагаю, что кодировщик не сделал этого. Не понимаю этот факт.

Изменить:

Как указал kdgregory , есть влияние на то, как эта константа может быть встроена.

1 - https: //docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5[1215 impression

17
ответ дан 27 November 2019 в 04:20
поделиться

Некоторое время назад я intern () редактировал все строки, поступающие из файлов классов (для парсера файлов классов). Intern () ing заставил программу использовать меньше памяти (в этом случае не будет, как указывали другие), но это значительно замедлило работу программы (я думаю, что потребовалось 4 секунды, чтобы проанализировать весь rt.jar, и это изменение поставило его более 8 секунд). Изучая его в то время (я думаю, это был JDK 1.4), код intern () довольно уродлив и медленнее, чем, вероятно, должен быть.

Если бы я подумал о вызове intern () в своем коде, я бы сначала профилировал его без intern (), а затем профилируйте его с помощью intern () как для памяти, так и для скорости, и посмотрите, какой из них «хуже» для изменений.

Intern () ing заставил программу использовать меньше памяти (в этом случае не будет, как указывали другие), но это значительно замедлило работу программы (я думаю, что потребовалось 4 секунды, чтобы проанализировать весь rt.jar, и это изменение поставило его более 8 секунд). Изучая его в то время (я думаю, это был JDK 1.4), код intern () довольно уродлив и медленнее, чем, вероятно, должен быть.

Если бы я подумал о вызове intern () в своем коде, я бы сначала профилировал его без intern (), а затем профилируйте его с помощью intern () как для памяти, так и для скорости, и посмотрите, какой из них «хуже» для изменений.

Intern () ing заставил программу использовать меньше памяти (в этом случае не будет, как указывали другие), но это значительно замедлило работу программы (я думаю, что потребовалось 4 секунды, чтобы проанализировать весь rt.jar, и это изменение поставило его более 8 секунд). Изучая его в то время (я думаю, это был JDK 1.4), код intern () довольно уродлив и медленнее, чем, вероятно, должен быть.

Если бы я подумал о вызове intern () в своем коде, я бы сначала профилировал его без intern (), а затем профилируйте его с помощью intern () как для памяти, так и для скорости, и посмотрите, какой из них «хуже» для изменений.

7
ответ дан 27 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: