String 클래스

스트링 클래스 선언
리터럴
String text = "text";
New
String text = new String("text");
둘다 print 를 해보면 값은 똑같이 나온다 하지만 둘은 분명한 차이가 있다.
☝️ 리터럴로 선언된 String 클래스는 선언시 객체가 String constant pool 에 저장이되는 반면 new 는 Heap 영역에 저장이 된다. 다음 예를 보자
String text = new String("text");
String text2 = "text";
System.out.print(text == text2); // false
💁 false 가 나오는 이유가 뭘까?
위에서 언급한 리터럴과 new 의 선언 시 저장되는 객체의 위치 때문이다. text 과 text2 의 값은 모두 text 라는 값을 가지고 있다. 하지만 객체가 다르다 text String constant pool 에 저장된 객체를 갖고 있고 text2는 Heap 영역에 저장되어있는 객체이다 따라서 1차적으로 객체가 다르기 때문에 단순비교인 == 로는 두 객체의 값을 비교할수는 없다.
String text = "text";
String text2 = "text";
System.out.print(text == text2); // true
💁 true 가 나오는 이유가 뭘까?
이는 text 생성시 string constant pool에 "text" 값을 지닌 String 객체 하나가 생성된다. 이후 text2 생성시 String 클래스는 불변 객체이기 때문에 미리 intern() 메서드에서 탐색이 되어 미리 생성된 객체가 공유되어 단순 비교인 == 에 true 값이 나오게 된다.
🤔 intern() 은 뭐지?
간단하게 설명하면 String constant pool 에서 문자열을 조회하여 존재시 그 객체를 반환, 아닐 경우 등록 하는 메서드다 = 이를 통해 불변객체가 가지는 동일한 객체를 공유할 수 있는 특징을 사용할수 있고 동일한 객체가 하나만 생기게 할수도 있다.

String text = new String("text");
String text2 = "text";
System.out.print(text == text2); // false
System.out.print(text.equals(text2); // true
length();
String text = new String("text");
System.out.print(text.length()); // 4
isEmpty();
String text = new String("text");
System.out.print(text.isEmpty()); // false
indexOf();
String text = new String("text");
System.out.print(text.indexOf(t))); // 1
substring();
String text = new String("text");
System.out.print(text.substring(0,2)); // te
replaceAll();
String text = new String("text");
System.out.print(text.replaceAll("text", "word"); // word
split();
String str2 = "apple,banana,orange";
String[] array1 = str2.split(",");
System.out.println(Arrays.toString(array1));
[apple, banana, orange]
https://kutar37.tistory.com/entry/자바-String-클래스의-메소드
https://www.latera.kr/blog/2019-02-09-java-string-intern/