2017-01-18 3 views
3

Является ли a == b всегда true во всех Java-совместимых реализациях?Является ли оптимизация пула строк, определенная Java?

String a = "abc"; 
String b = "abc"; 

if (a == b) 
    System.out.println("True"); 

меня спросили, True будет напечатано в собеседовании. Я знал, что a и b могут указывать на тот же "abc" как на оптимизацию, но я не был уверен, стандартизирована ли эта оптимизация или это конкретное поведение реализации.

+1

В вашем примере да. Вы используете [строковые литералы] (http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal), которые java будет объединяться как один с помощью [String interning] (https: // en .wikipedia.org/вики/String_interning). Это не сработает, если вы создадите строковые объекты, что может случиться легко, поэтому ответ на собеседование должен содержать то, что, в то время как это работает в этом случае, это небезопасно, потому что вы можете скопировать код в место, где оно не работает, т работы. – Aziuth

+1

Высказывание вашего комментария о том, что вы удалили о том, что вы не ответили в интервью, в связи с этим: Итак, вы не знаете каждую деталь о java? И вы склонны искать решение для спасения вместо того, чтобы рисковать? Звучит разумно. Способность учиться гораздо важнее, чем некоторые детали. Хотя лучшим ответом было бы сказать что-то вроде «Я так не думаю, но я не уверен в этом». По крайней мере, если интервьюер умный. Ошибки случаются, и осознание того, что вы невосприимчивы к ошибкам, важно. В заключение не делайте этого слишком тяжело. – Aziuth

ответ

3

Да. Это гарантируется Java Language Specification #3.10.5:

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

3

интернирование строковых литералов является указано в спецификации языка Java, JLS section 3.10.5.

См. Также: Кроме того, строковый литерал всегда относится к одному экземпляру класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern

Итак, да, правильный ответ для вашего собеседования будет «да», но вы должны обязательно следить и сказать, что эквивалентность строк должна всегда проверяться через .equals().

Смежные вопросы