String s1 = new String ("abc") 과 String s2 = "abc" 의 차이

1583 단어 자바
오늘 JVM 을 볼 때 갑자기 이런 문제 가 생각 났 어 요. 즉,
String s1 = new String("abc");
String s2 = "abc";

System.out.println(s1 == s2);//   false

문 제 는 두 가지 가 있다.
  • String s2 = "abc" 때 무슨 일이 있 었 나 요?
  • String s1 = new String (abc) 때 또 무엇 을 했 습 니까?

  • 두 번 째 문 제 는 비교적 대답 하기 쉬 운 것 입 니 다. 공식 문서 에 따 르 면:
    new String(“abc”);
    Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.
    간단하게 설명 하 다.
    새로 만 든 String 대상 을 초기 화 합 니 다. 다시 말 하면 새로 만 든 문자열 은 매개 변수 문자열 의 사본 입 니 다.복사 본 이 필요 하지 않 으 면 이 방법 은 불필요 합 니 다. String 은 가 변 적 이지 않 기 때 문 입 니 다.
    이 말 은 실제로 두 가지 뜻 을 나타 낸다.
  • 컴 파일 러 가 컴 파일 할 때 컴 파일 러 가 매개 변수 가 문자열 상수 라 는 것 을 알 았 을 때 문자열 을 class 파일 의 상수 구역 에 상수 로 두 고 클래스 로 불 러 올 때 실행 상수 탱크 에 넣 습 니 다.
  • new 연산 자 를 호출 할 때 자바 더미 에 새로운 대상 을 만 든 다음 대상 의 내용 은 상수 탱크 에 해당 하 는 문자열 의 복사 입 니 다.

  • String s2 = "abc" 가 컴 파일 되 었 을 때, class 파일 에 이 문자열 상수 가 포함 되 어 있 는 지 확인 하고, 포함 되 어 있 으 면 상수 풀 의 대상 을 되 돌려 줍 니 다.
    따라서 new 작업 을 호출 할 때 대상 은 항상 더미 에 존재 하고 직접 문자열 할당 시 대상 은 실제 상수 탱크 에 존재 하기 때문에 비교 결 과 는 false 일 것 입 니 다.

    좋은 웹페이지 즐겨찾기