Java / .NET - повторное использование значений - PullRequest
1 голос
/ 13 октября 2010

Уменьшаем ли мы потребление памяти при хранении значения String, которое используем очень часто?

Насколько я знаю, каждый раз, когда мы делаем объявление "some text" в коде, новый StringОбъект создается вместо использования адреса существующего с тем же значением.Это правильно?

Можно ли что-нибудь сделать, чтобы сделать память более эффективной, всегда обращаясь к одному и тому же String, а не создавая новые?

Ответы [ 4 ]

2 голосов
/ 13 октября 2010

.NET использует внутренний пул строк для хранения строк.

Общеязыковая среда выполнения сохраняет строковое хранилище, поддерживая таблицу, называемую внутренним пулом, которая содержит одну ссылку на каждую уникальную литеральную строку, объявленную или созданную программным способом в вашей программе. Следовательно, экземпляр литеральной строки с определенным значением существует в системе только один раз.

Пример ниже показывает, что внутренний пул используется только для литеральной строки. (s2 не ссылается на ту же строку, что и s1, даже если содержимое совпадает)

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.

Java делает то же самое :

Все литеральные строки и строковые константные выражения интернированы.

1 голос
/ 13 октября 2010

Из api-doc для java 2 sdk:

Пул строк, изначально пустой, поддерживается в частном порядке классом String.При вызове метода intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула.В противном случае этот объект String добавляется в пул, и возвращается ссылка на этот объект String.

Итак, существует пул ...

Статья здесь делает некоторые хорошие замечания об этом.

1 голос
/ 13 октября 2010

Я бы не стал потеть, если бы вы не обнаружили подлинную проблему производительности / памяти, которую вы пытаетесь решить. Если вам абсолютно необходимо оптимизировать, то в Javamex есть полезная статья , в которой приведены некоторые советы о том, как сэкономить память, например, с помощью внутреннего пула строк Java.

0 голосов
/ 13 октября 2010

В Java вы совершенно не правы.Действительно, как и в .net (или, по крайней мере, как говорит @madgnome), существует пул константных строк .Обратите внимание, что, помимо всех константных строк, вы можете поместить строку в этот пул, вызвав String.intern().Но используйте этот метод с осторожностью, так как он может быть медленным из-за природы этого пула.

...