Сравнение строк в Java по ссылке

319
07 сентября 2017, 16:59

Во многих книгах по 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 создала два разных объекта, а во втором ссылается на один и тот же ?

Answer 1

Если вы используете явный вызов new, то создается новый объект. НО если вы используете не явное создание объекта, то компилятор помещает его в специальное хранилище - пул строк и поэтому при последующих неявных созданиях объекта он берется от туда.

Вы можете поместить строку в пул используя метод intern, но не помещайте туда все строки подряд, так как это не дает значительного прироста производительности и может вызвать переполнение памяти (OutOfMemoryError).

Вот статья об этом.

READ ALSO
Вызов session scope бина из контроллера

Вызов session scope бина из контроллера

Добрый деньПишу контроллер, который будет через каждое время отправлять по вебсокету на фронтенд данные

289
По каким критериям в Java строка попадает в пул строк?

По каким критериям в Java строка попадает в пул строк?

По сути этот вопрос продолжает другой вопрос

234
Написание SDK для браузерной игры [требует правки]

Написание SDK для браузерной игры [требует правки]

ЗдравствуйтеПишу неофициальный SDK для браузерной игры, который разработчики смогут встраивать в свой проект

201
Что означает данная строка?

Что означает данная строка?

Вот метод parse(String) из класса DateUtil:

242