자바. - StringBuffer 는 언제 쓰 고 StringBuilder 는 언제 쓰 나 요?

6643 단어 Java
1. 자바 의 String, StringBuilder, StringBuffer 의 차이 점
이 세 가지 유형 간 의 차 이 는 주로 두 가지 측면, 즉 운행 속도 와 스 레 드 안전 이라는 두 가지 측면 에 있다.
운행 속도
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);

이 코드 를 실행 하면 먼저 "abc" 를 출력 한 다음 에 "abcde" 를 출력 하 는 것 을 발견 할 수 있 습 니 다. str 라 는 대상 이 변 경 된 것 같 습 니 다. 사실은 이것 은 가상 일 뿐 입 니 다. JVM 은 이 몇 줄 의 코드 를 이렇게 처리 합 니 다. 먼저 String 대상 str 를 만 들 고 "abc" 를 str 에 할당 한 다음 에 세 번 째 줄 에서 JVM 은 새로운 대상 도 str 라 고 만 들 었 습 니 다.그 다음 에 원래 str 의 값 과 "de" 를 더 해서 새로운 str 에 값 을 부여 합 니 다. 원래 str 는 JVM 의 쓰레기 회수 메커니즘 (GC) 에 의 해 회수 되 기 때문에 str 는 실제 적 으로 변경 되 지 않 았 습 니 다. 즉, 앞에서 말 한 String 대상 이 생 성 되면 변경 할 수 없습니다.따라서 자바 에서 String 대상 에 대한 작업 은 실제 적 으로 새로운 대상 을 계속 만 들 고 오래된 대상 을 회수 하 는 과정 이기 때문에 실행 속도 가 매우 느리다.
String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());

이러한 출력 결과 도 "abcde" 와 "abcde" 이지 만 String 의 속 도 는 StringBuilder 보다 반응 속도 가 훨씬 빠 릅 니 다. 이것 은 첫 번 째 줄 의 조작 과 String str = "abcde" 때 문 입 니 다.똑 같 기 때문에 곧 다음 과 같은 형식 으로 쓰 면
String str1="abc";
String str2="de";
String str=str1+str2;

그러면 JVM 은 위 에서 말 한 것 처럼 끊임없이 대상 을 만 들 고 회수 하여 이 작업 을 진행 할 것 이다.속도 가 느 려 집 니 다.
스 레 드 보안
스 레 드 보안 에 있어 서 StringBuilder 는 스 레 드 가 안전 하지 않 고 StringBuffer 는 스 레 드 가 안전 합 니 다.
  • 문자열 버퍼 에서 StringBuffer 대상 이 여러 스 레 드 에 사 용 될 때 StringBuffer 에 synchronized 키 워드 를 가 질 수 있 는 방법 이 많 기 때문에 스 레 드 가 안전 하 다 고 보장 할 수 있 지만 StringBuilder 방법 은 이 키워드 가 없 기 때문에 스 레 드 안전 을 보장 할 수 없고 오류 가 발생 할 수 있 습 니 다.따라서 다 중 스 레 드 작업 을 하려 면 StringBuffer 를 사용 해 야 하지만 단일 스 레 드 의 경우 속도 가 빠 른 StringBuilder 를 사용 하 는 것 을 권장 합 니 다.

  • 2. 위 에서 알 고 있 는 답장 을 인용한다.
    저자: 돼지 링크:https://www.zhihu.com/question/20101840/answer/164866159 출처: 저작권 은 작가 의 소유 임 을 알 고 있 습 니 다.상업 전 재 는 작가 에 게 연락 하여 권한 을 수 여 받 으 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오.
    나 는 왜 이렇게 오래된 문제 가 나의 타임 라인 에 나 타 났 는 지 모르겠다. 대답 을 보 니 대부분 2012 년, 2013 년 의 대답 이 었 다. 그 시대 에 따라 어떤 역사 이 야 기 는 아직 신선 하지만 왜 답 이 하나 도 없 는 지 모르겠다.
    stringbuffer 는 물론 스 레 드 가 안전 합 니 다. stringbuffer 는 stringbuilder 보다 더 느 리 지만 다 중 스 레 드 의 경우 이론 적 으로 스 레 드 가 안전 한 stringbuffer 를 사용 해 야 합 니 다.
    그러나, 그러나, 누가 나 에 게 스 레 드 안전 한 string 패 치 가 필요 하 다 는 것 을 보 여 주 었 습 니까?맞 을 수 없다. 적어도 내 가 얕 은 십 여 년 동안 프로 그래 밍 생활 을 하면 서 만난 적 이 없다. 아마도 이 지구 상에 이런 프로 그래 밍 수요 가 존재 할 것 이다. 그러나 적어도 99.99.. 99% 의 프로그래머 와 는 무관 하 다.그래서 주제 주의 문제 에 대해 그들의 적용 장면 은 무엇 입 니까?가장 간단 한 대답 은 stringbuffer 는 기본적으로 장면 에 적용 되 지 않 습 니 다. 모든 상황 에서 stringbuilter 를 사용 해 야 합 니 다. 스 레 드 안전 이 필요 한 장면 을 만 나 지 않 는 한 여기 서 메 시 지 를 남 겨 주세요.
    그 다음 에 보충 하 겠 습 니 다. 스 레 드 안전 에 대해 서 는 만약 에 이런 장면 을 만 났 더 라 도 불행 하 게 도 99.99.. 99% 의 상황 에서 stringbuffer 를 선택 할 필요 가 없습니다. stringbuffer 의 스 레 드 안전 은 jvm 이 이상 하 게 순조롭게 실행 되 지 않도록 하 는 것 일 뿐 논리 적 정확 함 과 호출 순서 가 정확 하지 않 습 니 다.대부분의 경우 우리 에 게 필요 한 것 은 스 레 드 안전 이 아니 라 자물쇠 이다.
    마지막 으로, 왜 stringbuffer 의 존재 가 있 습 니까? 만약 정말 가치 가 없다 면, 왜 jdk 는 이런 종 류 를 제공 합 니까?
    답 은 너무 간단 합 니 다. 최초 로 stringbuilder 가 없 었 기 때문에 sun 의 사람들 은 어떤 어 리 석 은 생각 에 처 했 는 지 모 르 고 stringbuffer 를 스 레 드 로 안전 하 게 하기 로 결 정 했 습 니 다. 그리고 약 10 년 후에 사람들 은 이것 이 얼마나 어 리 석 은 결정 인지 깨 달 았 습 니 다. 10 년 동안 이 어 리 석 은 결정 이 자바 운행 속도 가 느리다 는 소문 에 얼마나 큰 힘 을 기 여 했 는 지 깨 달 았 습 니 다. 그래서...jdk 1.5 에서 드디어 비 스 레 드 안전 한 stringbuffer 를 제공 하기 로 결 정 했 고 stringbuilder 라 고 명명 되 었 습 니 다.참고 로 자바 c 도 아마 이 버 전부터 플러스 로 연 결 된 string 연산 을 모두 암시 적 으로 stringbuilder 로 바 꾼 것 같 습 니 다. 즉, jdk 1.5 부터 플러스 로 연 결 된 문자열 은 이미 어떠한 성능 손실 도 없 었 습 니 다.
    많은 평론 에서 지적 한 바 와 같이 나 는 위 에서 말 한 것 처럼 "플러스 로 문자열 을 연결 하 는 것 은 이미 어떠한 성능 손실 도 없다" 는 것 은 엄밀 하지 않다. 엄 밀 히 말 하면 순환 이 없 는 상황 에서 한 줄 로 플러스 로 문자열 을 연결 하 는 것 은 성능 손실 이 없다. 자바 컴 파일 러 는 암시 적 으로 stringbuilder 로 교체 되 지만 순환 이 있 는 상황 에서컴 파 일 러 는 충분 한 스마트 한 교 체 를 할 수 없고 불필요 한 성능 손실 이 있 을 수 있 으 므 로 순환 으로 문자열 을 연결 할 때 는 stringbuilder 를 사용 하 는 것 이 좋 습 니 다.
    3. StringBuffer 는 언제 쓰 고 StringBuilder 는 언제 쓰 나 요?
  • String: 소량의 문자열 작업 에 적용 되 는 경우
  • StringBuilder: 단일 스 레 드 에서 문자 버퍼 에서 대량 작업 을 하 는 경우
  • StringBuffer: 다 중 스 레 드 에서 문자 버퍼 에서 대량 작업 을 하 는 경우
  • 좋은 웹페이지 즐겨찾기