일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DP
- JPA
- java
- Redis
- BFS
- pandas
- equals
- series
- 문자열
- 자바
- dfs
- 알고리즘
- 스프링
- 헥사고날 아키텍처
- springboot
- 위상정렬
- dataframe
- 다익스트라
- 데이터 flow
- ddd
- docker
- UML
- 비트마스크
- disjoint set
- spring security
- 파이썬
- 백준
- 포트앤어댑터 아키텍처
- 이펙티브 자바
- 세그먼트 트리
- Today
- Total
코딩못하는사람
문자열 String 본문
자바의 String 객체와 String 리터럴
자바에서 String은 객체로 선언할 수도 있고 리터럴로도 선언할 수 있다.
String temp=new String("abcde"); 은 new 연산자를 활용한 객체 생성 방식
String temp1="abcde"; 은 문자열 리터럴 방식으로 선언한 방식이다.
객체를 생성하는 방식은 Heap영역에, 리터럴은 Heap영역 속 String constant pool에 저장된다.
예시 그림을 보고 이해하자.
String str1 = "madplay";
String str2 = "madplay";
String str3 = new String("madplay");
String str4 = new String("madplay");
문자열 비교
equals메소드: String의 equals()를 사용하면 단순히 문자열들의 값을 비교한다.
==연산 : 각 객체들의 주소값을 비교한다.
따라서 new 연산자로 str3,str4는 equals 메소드로는 true지만 ==연산은 false이다.
str3.equals(str4) >>true str3==str4 >> false
str1.equals(str4) >>true str1==str4 >> false
str1.equals(str2) >>true str1==str2 >> true
왜?
문자열 리터럴의 경우에는 String의 intern메서드를 호출해서 비교한다고 한다.
intern메서드는 해당문자열이 String constant pool에 존재하면 그 주소를 반환하고
없으면 새로 집어넣고 가져온다고 한다.
위의 예시를 마저 이용하면 str1==str2인 이유는 str1에서 scp에 문자열을 만들어 놓았고
str2에서는 그 주소를 받아와서 연산을 하므로 서로 같은 주소이므로 true값이다.
str1==str3는 당연히 false일테지만 str1==str3.intern()은 true일 것이다.
(intern은 "madplay"의 scp주소를 가져올 것이므로)
madplay.github.io/post/java-string-literal-vs-string-object를 보고 공부하였습니다.
'자바 메모장 > 개념 및 문법' 카테고리의 다른 글
Immutable,mutable 객체 (0) | 2021.02.10 |
---|---|
JVM 메모리 구조 정리 (2) | 2021.02.09 |
배열 정렬 Array.sort() (0) | 2021.02.08 |
StringBuilder를 쓰는 이유 (2) | 2021.02.07 |
printf,println의 차이와 소수점 자리 출력(백준 4344) (0) | 2021.02.06 |