Я провел небольшое исследование, чтобы узнать, как метод 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() может помочь сохранить больше свободной памяти?