String 상세 설명

9699 단어 자바 기반
문자열 변경 불가
  • String 은 final 로 밝 혀 지고 계승 할 수 없 으 며 하위 계승 을 통 해 String 류 를 변경 할 수 없습니다
  • 내부 에서 final 형의 byte 배열 value 를 사용 하여 문자열 내용 을 저장 하 는 것 은 배열 의 주소 공간 이 바 뀌 지 않 음 을 의미 하 며,value 는 다른 배열 을 참조 할 수 없습니다
  • String 내부 에서 value 배열 의 내용 을 바 꾸 는 방법 을 제공 하지 않 았 습 니 다
  • 불가 변 의 이점
  • 스 레 드 안전 String 은 가 변 적 이지 않 고 여러 스 레 드 에서 안전하게 사용 할 수 있 습 니 다
  • hash 값 String 을 캐 시 할 수 있 는 hash 값 은 자주 사 용 됩 니 다.예 를 들 어 hashmap 에서 key 로 서 key 의 hash 값 을 계산 하여 색인 위 치 를 계산 해 야 합 니 다.String 은 가 변 적 이지 않 아서 hash 값 도 가 변 적 이지 않 습 니 다.hash 값 은 한 번 만 계산 하면 됩 니 다.여러 번 계산 하지 않 아 도 됩 니 다
  • 문자열 상수 탱크 캐 시 String 은 변 하지 않 습 니 다.일부 문자열 의 글자 크기 는 캐 시 로 문자열 상수 탱크 에 저장 할 수 있 습 니 다.같은 문자열 의 글자 크기 는 중복 되 지 않 고 메모 리 를 절약 할 수 있 습 니 다.String 은 가 변 적 이지 않 기 때문에 모든 문자열 의 글자 크기 를 문자열 상수 탱크 에 캐 시 할 수 있 습 니 다
  • 안전성 String 은 매개 변수 로 자주 사용 되 는데 String 만 변 하지 않 아야 매개 변수 가 변 하지 않 음 을 보증 할 수 있 습 니 다.예 를 들 어 String 은 데이터베이스 연결 매개 변수(사용자 이름,비밀번호 등)로 서 String 이 가 변 적 이면 데이터베이스 연결 과정 에서 문자열 매개 변수 내용 이 바 뀌 어서 예상 치 못 한 오류 가 발생 할 수 있 습 니 다
  • String 상수 탱크
  • String 상수 탱크 에는 캐 시 로 사용 되 는 String 인 스 턴 스 가 저장 되 어 있 습 니 다
  • String 상수 풀 을 추가 하 는 두 가지 방법:String 글자 의 양 은 컴 파일 기간 에 생 성 되 고 String 상수 풀 에 추 가 됩 니 다.실행 기간 에 String 의 intern()방법 을 사용 하여 이 String 인 스 턴 스 를 String 상수 풀 에 추가 하고 인용 을 되 돌려 줍 니 다(전 제 는 상수 풀 에 이 String 인 스 턴 스 의 캐 시 가 존재 하지 않 는 다 는 것 입 니 다)
  • String 인 스 턴 스 를 생 성 하려 면 이 String 인 스 턴 스 가 글자 의 양 이 라면 먼저 String 상수 풀 에서 생 성 할 String 글자 의 양 과 같은 인 스 턴 스 가 있 는 지 확인 합 니 다(equals 방법 을 사용 하여 true).없 으 면 String 인 스 턴 스 를 만 들 고 String 상수 풀 에 캐 시 로 다른 String 인 스 턴 스 를 사용 합 니 다.있 으 면 새 String 인 스 턴 스 를 만 들 지 않 고 String 상수 풀 에 있 는 String 인 스 턴 스 의 인용 을 되 돌려 주면 됩 니 다.String 글자 의 양 이 프로 그래 밍 에서 자주 반복 되 기 때문에 너무 많은 String 인 스 턴 스 를 만 드 는 것 을 방지 할 수 있 습 니 다

  • 다음 두 가지 예 를 보면 알 수 있다.
            String b = "b";
            String s1 = new String("aaa"+b);//           ,     :  "aaa"      ,     :  "aaab"    , +    ,  s1   ,         ,   "aaab"      , new  ,s1   String      "aaab"
            String s3 = s1.intern();//String  "aaab"     String    ,  intern     s1          ,   s1   ,  s1 s3     ,      
            System.out.println(s1==s3);//true
    
            String s1 = new String("aaa"+"b"); //         "aaab"String  ,                。           ,       ,     
            String s3 = s1.intern();//              "aaab"   ,  intern      s1       ,         "aaab"      , s1         "aaab"     ,     false
            System.out.println(s1==s3);//false
    

    컴 파일 기간 최적화 에 대하 여 사용+두 개의 String 인 스 턴 스 를 연결 하고 아래 코드 를 자세히 읽 습 니 다.
            String rea = "ab";//     String       
            String b = "b";
            final String d = "b";//String  ,         d   ,      d   d   ,       
            String test1 = "a"+"b";//     ,    String test1 = "ab",    rea         ,          String  ,     rea      test1
            String test2 = "a"+b;//+    String  ,       test2  ,      ,      String  
            String test3 = "a"+d;//+   d     ,       d   d     "b",  +        , test1  
            System.out.println(test1==test1.intern());//true
            System.out.println(test1==rea); //true
            System.out.println(test2==test2.intern());//false
            System.out.println(test2.intern()==rea);//true
            System.out.println(test3==test3.intern());//true
            System.out.println(test3.intern()==rea);//true
    

    자바 7 이전에 String 상수 풀 은 실행 시 상수 풀 에 놓 여 있 으 며 영구적 인 세대 에 속 합 니 다.자바 7 에 서 는 String 상수 탱크 가 쌓 여 있 습 니 다.영구 세대 의 공간 이 제한 되 어 있 기 때문에 문자열 을 대량으로 사용 하 는 장면 에서 OutOf Memory Error 오류 가 발생 할 수 있 습 니 다.
    String,StringBuffer 및 StringBuilder 구별
    가 변성 String 불가 변 StringBuffer 와 StringBuilder 가 변
  • 스 레 드 안전 String 은 가 변 적 이지 않 기 때문에 스 레 드 안전 한 StringBuilder 는 스 레 드 안전 한 StringBuffer 가 아 닙 니 다.내부 에서 synchronized 를 사용 하여 동기 화 를 진행 합 니 다.StringBuilder 와 StringBuffer 는 모두 AbstractStringBuilder 를 계승 하여 본질 적 으로 차이 가 많 지 않 지만 StringBuilder 는 synchronize 동기 화가 적어 속도 가 빠 릅 니 다.StringBuffer 는 동기 화 처 리 를 해 야 하기 때문에 자물쇠 에 비용 이 들 기 때문에 더욱 느리다
  • 좋은 웹페이지 즐겨찾기