Задача с собеседования на Java программиста на строки
https://t.me/faangmasterУсловие. Что напечатает такая программа?
String s1 = "FAANG";
String s2 = "FAANG";
String s3 = new String("FAANG");
System.out.println((s1 == s2) + " " + (s1 == s3));
Решение. Правильный ответ true false.
Дело в том, что сравнение "==" сравнивает референсы на объекты, а не содержание объектов. Поэтому, если нужно сравнивать содержимое объектов, то рекомендуется использовать метод equals.
Но тогда может показаться, что ответ должен быть false false. Т.к. это три разные строки и их ссылки должны быть разными.
Но строки в Java, которые созданы не при помощи new создаются в специльной области памяти, которая называется String Pool: https://www.baeldung.com/java-string-pool. Такие строковые литералы будут храниться в String Pool и не будут дублироваться. Т.е. String s1 = "FAANG"; создаст новую строку в String Pool. А уже второй раз он такую же строку создавать не будет. Он просто переиспользует ту же саму строку и просто присвоит адрес этой строки s2.
Если же строка создается при помощи new, то строка будет создана в Java Heap. И у нее будет уже другой адрес. Поэтому при сравнении s1 == s2 мы получим true (мы сравним адреса одной и той же строки из String Pool), а s1 == s3 вернет false (т.к. это разные объекты. Первая в String Pool, а вторая в Java Heap с другим адресом).