Java String 문자열 상수 풀 분석

가장 기본 적 인 인용 데이터 형식 으로서 자바 디자이너 는 String 에 문자열 상수 탱크 를 제공 하여 성능 을 향상 시 켰 다.그러면 문자열 상수 탱크 의 구체 적 인 원 리 는 무엇 입 니까?우 리 는 다음 과 같은 세 가지 문 제 를 가지 고 문자열 상수 탱크 를 이해 합 니 다.
  • 문자열 상수 탱크 의 디자인 의 도 는 무엇 입 니까?
  • 문자열 상수 탱크 는 어디 에 있 습 니까?
  • 문자열 상수 탱크 를 어떻게 조작 합 니까?
  • 문자열 상수 탱크 의 디자인 사상
  • 문자열 의 분 배 는 다른 대상 의 배분 과 마찬가지 로 높 은 시간 과 공간 대 가 를 소모 합 니 다.가장 기본 적 인 데이터 형식 으로 문자열 을 대량으로 만 들 고 프로그램의 성능 에 큰 영향 을 줍 니 다
  • JVM 은 성능 을 향상 시 키 고 메모리 비용 을 줄 이기 위해 문자열 의 상수 를 예화 할 때 최적화 시 켰 다.
  • 문자열 에 문자열 상수 풀 을 엽 니 다.캐 시 영역
  • 과 유사 합 니 다.
  • 문자열 상수 만 들 때 먼저 문자열 상수 탱크 에 이 문자열 이 존재 하 는 지 확인 합 니 다
  • 이 문자열 이 존재 합 니 다.인 스 턴 스 를 되 돌려 줍 니 다.존재 하지 않 습 니 다.이 문자열 을 예화 하고 풀 에 넣 습 니 다
  • 실현 의 기초
  • 이 최 적 화 를 실현 하 는 기 초 는 문자열 이 가 변 적 이지 않 기 때문에 데이터 충돌 을 걱정 하지 않 고 공유 할 수 있 기 때문이다
  • 실 행 될 때 인 스 턴 스 가 만 든 전역 문자열 상수 탱크 에는 표 가 있 습 니 다.항상 풀 에 있 는 유일한 문자열 대상 에 게 인용 을 유지 합 니 다.이 는 문자열 상수 탱크 의 대상 을 참조 하고 있 음 을 의미 합 니 다.따라서 상수 탱크 에 있 는 이 문자열 들 은 쓰레기 수집 기 에 의 해 회수 되 지 않 습 니 다
  • 코드:문자열 상수 탱크 에서 해당 하 는 문자열 가 져 오기
    
     String str1 = “hello”;
     String str2 = “hello”;
     
     System.out.printl("str1 == str2" : str1 == str2 ) //true 
    문자열 상수 탱크 가 어디 에 있 습 니까?
    문자열 상수 탱크 의 위 치 를 분석 할 때 먼저 더미,스 택,방법 구역 을 알 아 보 세 요.

    쌓다
  • 저 장 된 대상 은 대상 이 고 모든 대상 은 이에 대응 하 는 class
  • 를 포함한다.
  • JVM 은 하나의 더미 구역(heap)만 모든 스 레 드 에 공유 되 고 더미 에 기본 형식 과 대상 인용 을 저장 하지 않 으 며 대상 자체 만 저장 합 니 다
  • 대상 은 쓰레기 수 거기 가 수 거 를 담당 하기 때문에 크기 와 생명주기 가 확정 되 지 않 아 도 된다
  • 창고.
  • 각 스 레 드 는 스 택 구역 을 포함 하고 스 택 에는 기본 데이터 형식의 대상 과 사용자 정의 대상 의 참조 만 저장 합 니 다(대상 이 아 닙 니 다)
  • 모든 스 택 의 데이터(원본 유형 과 대상 참조)는 사유
  • 입 니 다.
  • 스 택 은 3 개 부분 으로 나 뉜 다.기본 유형 변수 구역,실행 환경 컨 텍스트,작업 명령 구역(작업 명령 저장)
  • 데이터 크기 와 생명 주 기 는 확정 할 수 있 으 며,가리 키 는 데 이 터 를 인용 하지 않 으 면 이 데 이 터 는 자동 으로 사라 집 니 다
  • 방법 영역
  • 정적 구역,더미 와 같이 모든 스 레 드 에 공유
  • 방법 구역 에 포 함 된 것 은 전체 프로그램 에서 영원히 유일한 요소 입 니 다.예 를 들 어 class,static 변수
  • 문자열 상수 탱크 는 방법 영역 에 존재 합 니 다.
    코드:스 택 방법 영역 저장 문자열
    
    String str1 = “abc”;
    String str2 = “abc”;
    String str3 = “abc”;
    String str4 = new String(“abc”);
    String str5 = new String(“abc”);

    문자열 개체 생 성
    면접 문제:String str4=new String("abc")은 몇 개의 대상 을 만 듭 니까?
  • 상수 탱크 에서"abc"대상 이 있 는 지 찾 습 니 다.
  • 대응 하 는 인용 인 스 턴 스 를 되 돌려 줍 니 다
  • 없 으 면 해당 하 는 인 스 턴 스 대상 만 들 기
  • 더미 속 new String("abc")대상
  • 대상 주 소 를 str4 에 할당 하고 인용
  • 을 만 듭 니 다.
    따라서 상수 탱크 에'abc'글자 가 없 으 면 두 개의 대상 을 만 듭 니 다.그렇지 않 으 면 대상 을 만 들 고 인용 을 만 듭 니 다.
    글자 의 양 에 따라 이런 변 식 문 제 를 제기 하 는 경우 가 많다.
    String str1 = new String("A"+"B") ; 대상 을 몇 개 만 들 까요?
    String str2 = new String("ABC") + "ABC" ; 대상 을 몇 개 만 들 까요?
    str1:
    문자열 상수 탱크:"A","B","AB":3 개
    더미:new String("AB"):1 개
    인용:str 1:1 개
    총 5 개
    str2 :
    문자열 상수 탱크:"ABC":1 개
    더미:new String("ABC"):1 개
    인용:str 2:1 개
    총 3 개
    코드:기본 형식의 변수 와 상수,변수 와 인용 은 스 택 에 저장 되 고 상수 풀 에 저 장 됩 니 다.
    
    int a1 = 1;
    int a2 = 1;
    int a3 = 1;
    
    public static int INT1 =1 ;
    public static int INT2 =1 ;
    public static int INT3 =1 ;

    문자열 상수 탱크 를 조작 하 는 방식
    JVM 실례 화 문자열 상수 탱크 시
    
     String str1 = “hello”;
     String str2 = “hello”;
     
     System.out.printl("str1 == str2" : str1 == str2 ) //true
    String.intern()
    new 연산 자 를 통 해 만 든 문자열 대상 은 문자열 풀 의 모든 대상 을 가리 키 지 않 지만 문자열 의 intern()방법 으로 그 중 하 나 를 가리 킬 수 있 습 니 다.java.lang.string.intern()은 전체 문자열 풀 에 입구 가 있 는 보존 풀 문자열 을 되 돌려 줍 니 다.전역 문자열 풀 에 없 었 다 면 추가 되 었 을 것 입 니 다.
    
        // Create three strings in three different ways.
        String s1 = "Hello";
        String s2 = new StringBuffer("He").append("llo").toString();
        String s3 = s2.intern();
     
        // Determine which strings are equivalent using the ==
        // operator
        System.out.println("s1 == s2? " + (s1 == s2)); // false
        System.out.println("s1 == s3? " + (s1 == s3)); // true
    
    보충:글자 양 과 상수 탱크 초기 분석
    문자열 대상 내 부 는 문자 배열 로 저장 되 어 있 습 니 다.다음 예 를 보십시오.
    
     String m = "hello,world";
      String n = "hello,world";
      String u = new String(m);
      String v = new String("hello,world");
  • 11 길이 의 char 배열 을 할당 하고 상수 탱크 에 이 char 배열 로 구 성 된 문자열 을 할당 한 다음 m 에서 이 문자열
  • 을 참조 합 니 다.
  • n 으로 상수 탱크 안의 문자열 을 참조 하기 때문에 n 과 같은 대상
  • 을 참조 합 니 다.
  • 새로운 문자열 을 만 들 지만 내부 문자 배열 은 m 내부 문자 배열
  • 을 참조 합 니 다.
  • 역시 새로운 문자열 을 생 성 하지만 내부 의 문자 배열 은 상수 탱크 안의 문자열 내부 의 문자 배열 을 참조 합 니 다.u 와 같은 문자 배열
  • 이라는 뜻 입 니 다.
    그림 으로 표시 하면 상황 은 대략 이렇다.

    테스트 데모:
    
          String m = "hello,world";
          String n = "hello,world";
          String u = new String(m);
          String v = new String("hello,world");
          
          System.out.println(m == n); //true 
          System.out.println(m == u); //false
          System.out.println(m == v); //false
          System.out.println(u == v); //false 
      
    결론:
  • m 와 n 은 같은 대상
  • m,u,v 는 모두 다른 대상
  • m,u,v,n 은 같은 문자 배열 을 사 용 했 고 equal 로 판단 하면 true
  • 로 돌아 갑 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기