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/