Во многих книгах по java (например, "Философия Java") пишут, что при написании конструкции вида String s = "some string" на самом деле происходит создание нового объекта String, примерно так: String s = new String("some string").
Почему тогда я делаю System.out.println(new String("a") == new String("a")) и получаю false. Но в случае System.out.println("a" == "a") получаю true.
Почему в первом случае jvm создала два разных объекта, а во втором ссылается на один и тот же ?
Если вы используете явный вызов new, то создается новый объект. НО если вы используете не явное создание объекта, то компилятор помещает его в специальное хранилище - пул строк и поэтому при последующих неявных созданиях объекта он берется от туда.
Вы можете поместить строку в пул используя метод intern, но не помещайте туда все строки подряд, так как это не дает значительного прироста производительности и может вызвать переполнение памяти (OutOfMemoryError).
Вот статья об этом.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости