Если в разных потоках , да, условие будет истинным.
Если на разных загрузчиках классов , я бы не рассчитывал, что условие истинно. (Но действительно ли вы загружаете две копии String
, используя разные загрузчики классов?) В документации сказано, что intern
реализован в String
с использованием собственного кэша. Из String#intern
документации :
Возвращает каноническое представление для строкового объекта.
Пул строк, изначально пустой, поддерживается в частном порядке классом String
.
(Мой акцент)
Итак, если вы как-то дважды загрузите класс String
, используя разные загрузчики классов (я не уверен, как вы это сделаете, но держу пари, что есть способ), то каждый из классов String
будет иметь свой кэш & mdash; в теории . Тем не менее, реализация может не проводить такое различие. intern
- это нативный метод в Oracle JVM, использующий таблицу символов, реализованную в C ++. Я не достаточно внимательно следил за логикой, чтобы понять, будут ли два экземпляра String
в одной JVM, о которых вы говорите, использовать одну и ту же таблицу символов, или нет. Но в этот момент мы смотрим на реализацию, которая может варьироваться. документация предполагает, что нет, они не будут одинаковыми.