Я провел небольшое исследование, чтобы узнать, как метод String.intern()
реализован в java.
Я посмотрел на С++ реализацию Intern Pool из Open JDK 6, и там я увидел простой HashSet
. Для меня это означало, что когда кто-то пытается ставить a String
, следующие шаги должны быть выполнены:
- поиск хеш-кода, связанного с данным
String
- поиск соответствующего ведра
- сравнение данной строки со всеми другими строками в ведре. До этого шага может быть 0 строк, одна строка или LOT OF Строки в ковше. Итак, если данная строка была ранее поместите в ведро мы получим хотя бы одно сравнение (что лучший случай. Конечно, могло быть много столкновений и теперь многие другие строки находятся в ведре)
- Если строка была найдена в ведре, тогда она должна быть
возвращен методом
intern()
- Если строка не найдена в ковше, тогда она должна быть помещена
в ведро и возвращен методом
intern()
Так много людей говорят, что str1.intern() == str2.intern()
будет быстрее, чем str1.equals(str2)
.
Но я не вижу причины, по которой она должна быть быстрее.
Как я вижу в случае str1.equals(str2)
, мы всегда имеем две строки, сравнивающие char с помощью char в методе String.equals()
.
В случае str1.intern() == str2.intern()
, сколько сравнений нам нужно было бы получить или поместить String в/из пула (правильно, это может быть много сравнений, и они простые char путем сравнения char слишком)?
Поэтому в случае str1.intern() == str2.intern()
, даже если мы используем ==
для сравнения строк, у нас также будет много дополнительных действий, таких как сравнения, описанные ранее.
Когда я понял это, я решил провести несколько эталонных тестов.
Первые результаты показали мне, что str1.intern() == str2.intern()
был быстрее, чем str1.equals(str2)
.
Такое поведение было вызвано тем, что метод String.intern()
является родным, поэтому его не следует интерпретировать каждый раз, а String.equals()
- это метод java.
Итак, я решил использовать параметр -Xcomp
, чтобы JVM скомпилировал весь код при запуске.
После этого уровень показал лучшую скорость, чем стажер.
Я тестировал его на Java 6 и 7.
Итак, мой вопрос: вы когда-нибудь видели ситуацию, когда стажировка увеличивала скорость сравнения String? Я да, как это может быть?
Или, может быть, intern()
может помочь сохранить больше свободной памяти?