String은 immutable(불변성)하다. 즉 한번 생성되면 계속 그 상태로 있는것이다.
자바는 이런 불변성을 java string constant pool을 사용해서 얻을 수 있다.
String str1 = "Hello"
이렇게 선언하면

stack에 객체명이 저장되고 Heap영역안에 String constant pool에 Hello 값이 저장된다.
만약
String str2 = "Hello"
라고 하면 스택에 str2 객체명이 생성되고 이미 string pool에 값이 있어서 생성되지 않고 이미 있는 값을 가리킨다

String str1 = new String("John");
String str2 = new String("Doe");
new 키워드를 사용하면 이전에 그 문자가 사용되었는지 관계 없이 Heap 영역에 새로 생성된다.

참고
https://www.baeldung.com/java-string-pool
https://www.geeksforgeeks.org/string-constant-pool-in-java/