public static void main(String[] args) {
String based1 = "Я стажёр и работаю за компот";
String based2 = "Я стажёр и работаю за компот";
String based3 = new String("Я стажёр и работаю за компот");
String based4 = new String("Я стажёр и работаю компот");
String based5 = new String("Я стажёр и работаю за компот").intern();
System.out.println(based1 == based2);
System.out.println(based1 == based3);
System.out.println(based3 == based4);
System.out.println(based4 == based5);
System.out.println(based1 == based5);
}Что выведется на экране при сравнении этих строк?
Результат
true
false
false
false
true
Объяснение
based1 и based2 - строковые литералы одинаковы, джава помещает их в String Pool, где ссылки переменных указывают на один и тот же объект.
based3 создаётся через конструктор new => значение литерала находится в пуле, но new String() создаёт новый объект в куче, и ссылка указывает именно на этот новый объект.
based4 - ещё один новый объект в куче, отличный от based3.
based5 - применяем метод intern(), который ищет строку в пуле и возвращает ссылку на объект из пула, а не созданный через new (если не находит, то добавляет строку в пул).
Немножко о строках в java
String в джаве - неизменяемый тип. Это позволяет хранить строковые литералы в специальной области в куче - String Pool и оптимизировать память (если значение уже есть в пуле, то новое не создаётся, а возвращается ссылка на старый объект без выделения дополнительной памяти). Если же строка создаётся динамически (с помощью конструктора), то новый объект создаётся в куче в любом случае.
@codeof_art