Это - хорошая практика для использования java.lang. String.intern ()?

Я не верю так, хотя можно загрузить стандартные файлы ASPX в SharePoint и сделать, чтобы они работали, я вполне уверен, которым состоит в том перезапись URL, где это отклеилось бы.

193
задан Daniel Rikowski 11 January 2010 в 04:20
поделиться

8 ответов

Когда мне следует использовать эту функцию в пользу String.equals ()

, когда вам нужна скорость , поскольку вы можете сравнивать строки по ссылке (== быстрее, чем equals)

Есть ли побочные эффекты, не упомянутые в документации Javadoc?

Главный недостаток состоит в том, что вы должны помнить, что вы действительно выполняете intern () для всех строк, которые вы собираетесь сравнивать. Легко забыть intern () для всех строк, и тогда вы можете получить неверные результаты. Кроме того, ради всех, пожалуйста, убедитесь, что вы очень четко задокументируете, что вы полагаетесь на интернализируемые строки.

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

(от JGuru)

Третий недостаток (Java 7 или меньше только): интернированные строки живут в пространстве PermGen, которое обычно довольно мало; вы можете столкнуться с OutOfMemoryError с большим количеством свободного места в куче.

(от Майкла Боргвардта)

125
ответ дан 23 November 2019 в 05:26
поделиться

Я бы проголосовал за то, что это не стоит хлопот по обслуживанию.

Большинство из них время, в этом не будет необходимости и не будет никакого выигрыша в производительности, если только ваш код не выполняет много работы с подстроками. В этом случае класс String будет использовать исходную строку плюс смещение для экономии памяти. Если в вашем коде много подстрок, я подозреваю, что это приведет к резкому увеличению требований к памяти.

1
ответ дан 23 November 2019 в 05:26
поделиться

Мне не известны какие-либо преимущества, и если бы они были, можно было бы подумать, что equals () сам использовал бы intern () для внутренних целей (чего он не делает).

Busting intern ( ) мифы

6
ответ дан 23 November 2019 в 05:26
поделиться

Я бы изучил intern и == - сравнение вместо равных только в случае равенства- сравнение является узким местом при множественных сравнениях строки. Маловероятно, что это поможет при небольшом количестве сравнений, потому что intern () не является бесплатным. После агрессивного интернирования строк вы обнаружите, что вызовы intern () становятся все медленнее и медленнее.

2
ответ дан 23 November 2019 в 05:26
поделиться

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

193
ответ дан 23 November 2019 в 05:26
поделиться

Не всегда - на некоторых архитектурах одна инструкция сборки транслируется в одну инструкцию машинного кода, а на других - нет.

Кроме того - вы можете ] никогда не предполагайте, что используемый вами программный язык компилирует, казалось бы, простую строку кода в одну инструкцию ассемблера. Более того, на некоторых архитектурах нельзя предполагать, что один машинный код будет выполняться атомарно.

Вместо этого используйте надлежащие методы синхронизации, в зависимости от языка, на котором вы кодируете.

Это означает, что в вашем приложении вы получаете ввод из внешнего источника и преобразуете его в объект, который имеет семантическое значение - скажем, идентификатор - но этот объект имеет тип, неотличимый от необработанных данных, и имеет другие правила относительно того, как программист должен его использовать.

Почти всегда лучше создать интернированный тип UserId (легко создать потокобезопасный универсальный механизм интернирования) и действовать как открытое перечисление, чем перегружать тип java.lang.String со ссылочной семантикой, если это идентификатор пользователя.

Таким образом, вы не запутаетесь, была ли интернирована конкретная строка или нет, и вы можете инкапсулировать любое дополнительное поведение, которое вам потребуется, в открытом перечислении.

и имеет разные правила относительно того, как программист должен его использовать.

Почти всегда лучше создать тип UserId , который является интернированным (легко создать потокобезопасный универсальный механизм интернирования) и действует как открытое перечисление, чем для перегрузки типа java.lang.String ссылочной семантикой, если это идентификатор пользователя.

Таким образом, вы не запутаетесь, была ли интернирована конкретная строка или нет, и вы можете инкапсулировать любое дополнительное поведение, которое вам потребуется, в открытом перечислении.

и имеет разные правила относительно того, как программист должен его использовать.

Почти всегда лучше создать тип UserId , который является интернированным (легко создать потокобезопасный универсальный механизм интернирования) и действует как открытое перечисление, чем для перегрузки типа java.lang.String ссылочной семантикой, если это идентификатор пользователя.

Таким образом, вы не запутаетесь, была ли интернирована конкретная строка или нет, и вы можете инкапсулировать любое дополнительное поведение, которое вам потребуется, в открытом перечислении.

Тип String со ссылочной семантикой, если это идентификатор пользователя.

Таким образом, вы не запутаетесь, была ли интернирована конкретная строка или нет, и вы можете инкапсулировать любое дополнительное поведение, которое вам потребуется, в открытом перечислении.

Тип String со ссылочной семантикой, если это идентификатор пользователя.

Таким образом, вы не запутаетесь, была ли интернирована конкретная строка или нет, и вы можете инкапсулировать любое дополнительное поведение, которое вам потребуется, в открытом перечислении.

7
ответ дан 23 November 2019 в 05:26
поделиться

String.intern() определенно мусор, собранный в современных JVM.
НИКОГДА не заканчивается память из-за активности ГХ:

// java -cp . -Xmx128m UserOfIntern

public class UserOfIntern {
    public static void main(String[] args) {
        Random random = new Random();
        System.out.println(random.nextLong());
        while (true) {
            String s = String.valueOf(random.nextLong());
            s = s.intern();
        }
    }
}

Смотрите больше (от меня) на миф о не GCed String.intern().

36
ответ дан 23 November 2019 в 05:26
поделиться

Настоящая причина использования стажеров не указана выше. Вы можете использовать его после получения ошибки нехватки памяти. Многие строки в типичной программе представляют собой String.substring () другой большой строки [подумайте о том, чтобы извлечь имя пользователя из 100-килобайтного xml-файла. Реализация java заключается в том, что подстрока содержит ссылку на исходную строку и начало + конец этой огромной строки. (Идея заключается в повторном использовании одной и той же большой строки)

После 1000 больших файлов, из которых вы сохраняете только 1000 коротких имен, вы сохраните в памяти целые 1000 файлов! Решение: в этом сценарии просто используйте smallsubstring.intern ()

0
ответ дан 23 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

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