Во многих книгах по 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).
Вот статья об этом.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньПишу контроллер, который будет через каждое время отправлять по вебсокету на фронтенд данные
По сути этот вопрос продолжает другой вопрос
ЗдравствуйтеПишу неофициальный SDK для браузерной игры, который разработчики смогут встраивать в свой проект