2013-03-21 3 views
3

У меня есть большое количество строк, которые равны. Значения не будут часто меняться.string.intern не используется меньше память

Поскольку string.intern() должен возвращать только ссылку, я интернировал каждый из списка из 100 миллионов точно таких же строк, хранящихся в ArrayList.

Я ожидал увидеть, что память Java идет вниз, но сохранение нормальной строки и интернированной строки показало разницу менее 0,1%.

Я что-то упустил или это ожидаемое поведение?

используйте код

long max = 100000000; 
    for(int i =0 ; i < max;i++){ 
     list.add("sometextelidedforbrevity".intern()); 
    } 

Память поколения Список без 1 242 360 Кб и 1 242 184 КБ.

+0

Как вы создаете эти строки? Покажите нам свой код. Возможно, они уже могут быть интернированы. – cdhowie

+4

Вы используете строковые литералы или 'new String()'? Поскольку строковые литералы интернированы автоматически ... –

+0

Сколько памяти используется? –

ответ

4

Строковые литералы интернированы автоматически. То есть выражение "sometextelidedforbrevity" всегда будет во время выполнения стать ссылкой на объект String, который был интернирован. Вызов intern() на уже интернированной строке эффективно не работает.

0

Я использовал струнные литералы, которые я пропустил в документации, благодаря cdhowie и Russel Zahniser для ответа в комментариях.

Это были уже будучи интернированным использованием литералов.

Из того, что я понимаю, единственный способ иметь строки, которые не интернированы, - это новый String().