자바 의 String, StringBuilder, StringBuffer 의 차이 점
String
문자열 상수
-
JDK1.0
StringBuilder
문자열 변수
스 레 드 가 안전 하지 않 습 니 다.
JDK1.0
StringBuffer
문자열 변수
스 레 드 보안
JDK1.5
삼자 구별
String 타 입 과 StringBuffer 타 입의 주요 성능 차 이 는 사실 String 이 가 변 적 이지 않 은 대상 이기 때문에 String 타 입 을 변경 할 때마다 새로운 String 대상 을 생 성 한 다음 에 포인 터 를 새로운 String 대상 에 가리 키 는 것 과 같 습 니 다.문자열 내용 을 자주 바 꾸 면 String 을 사용 하지 않 는 것 이 좋 습 니 다. 생 성 대상 마다 시스템 성능 에 영향 을 미 치기 때 문 입 니 다. 또한 메모리 에 인용 되 지 않 은 대상 이 많아 지면 JVM 의 쓰레기 수 거 기 GC 가 작 동 하기 시작 하고 프로그램 실행 속도 가 느 려 집 니 다.StringBuffer 형식 을 정의 하 는 대상 이 라면 문자열 내용 을 조작 할 때마다 새로운 대상 을 만 드 는 것 이 아니 라 StringBuffer 대상 자 체 를 조작 합 니 다.그래서 일반적으로 StringBuffer 를 사용 하 는 것 을 추천 합 니 다. 특히 문자열 대상 이 자주 바 뀌 는 경우.StringBuffer 는 synchronized 키 워드 를 가 질 수 있 는 방법 이 많 기 때문에 스 레 드 가 안전 하 다 는 것 을 보증 할 수 있 지만 StringBuilder 의 방법 은 이 키워드 가 없 기 때문에 스 레 드 안전 을 보장 할 수 없습니다.StringBuilder 클래스 는 StringBuffer 와 호 환 되 는 API 를 제공 합 니 다. 이 클래스 는 StringBuffer 의 간단 한 교체 로 설계 되 었 으 며 문자열 버퍼 가 하나의 스 레 드 에 사 용 될 때 사 용 됩 니 다.가능 하 다 면 이 종 류 를 우선 사용 하 는 것 을 권장 합 니 다. 대부분의 실현 에서 StringBuffer 보다 빠 르 기 때 문 입 니 다.양자 의 방법 은 기본적으로 같다.
어떤 특수 한 상황 에서 String 의 효율 은 String Buffer 보다 빠르다. 예 를 들 어:
String s1 = "123" + "456" + "789";
StringBuffer s2 = new StringBuffer("123").append("456").append("789");
첫 번 째 줄 코드 는 자바 가상 컴퓨터 에서 볼 때 사실은:
String s1 = "123456789";
컴 파일 기간 에 이미 완성 되 었 기 때문이다.
질문
public static void main(String[] args) {
String s1=new String("123");
String s2=new String("123");
System.out.println("s1==s2 :" + (s1==s2)); // false
String s3="456";
String s4="456";
System.out.println("s3==s4 :" + (s3==s4)); // true
}
:
s1==s2 :false
s3==s4 :true
s1 과 s2 는 자바 가상 컴퓨터 가 메모리 new 를 쌓 고 나 온 두 String 대상 의 메모리 주소 입 니 다. 그들의 값 은 같 지만 = = 비교 하 는 것 은 주소 이기 때문에 false 입 니 다.s3 와 s4 는 상수 탱크 에 저 장 된 것 으로 상수 탱크 에서 '456' 이 가리 키 는 유일한 보존 문자열 대상 의 주소 이기 때문에 true 입 니 다.
public static void main(String[] args) {
String s1 = "123";
String s2 = "456";
String s12 = s1 + s2;
String s="123456";
System.out.println(s12==s); // false
}
변수 s1, s2 는 상수 탱크 의 주 소 를 저장 합 니 다.s1 + s2 를 실행 할 때 JVM 은 먼저 더미 에 StringBuilder 클래스 를 만 들 고 s1 이 가리 키 는 문자열 대상 으로 초기 화 를 완료 한 다음 append 방법 으로 s2 가 가리 키 는 문자열 을 통합 합 니 다. 이 어 StringBuilder 의 toString () 방법 으로 더미 에 String 대상 을 만 듭 니 다.마지막 으로 생 성 된 String 대상 의 주 소 를 변수 s12 에 저장 합 니 다.변수 s 는 상수 탱크 의 'abcd' 에 대응 하 는 문자열 대상 의 주 소 를 저장 합 니 다.s12 와 s 주 소 는 틀림없이 다 를 것 이다.
총결산
String: 소량의 문자열 작업 에 적용 되 는 경우
StringBuilder: 단일 스 레 드 에서 문자 버퍼 에서 대량 작업 을 하 는 경우 에 적 용 됩 니 다.
StringBuffer: 다 중 스 레 드 에서 문자 버퍼 에서 대량 작업 을 하 는 경우 적용
컴 파일 기간 에 확인 할 수 있 는 문자열 상수 입 니 다. String 이나 StringBuffer 대상 을 만 들 필요 가 없습니다.문자열 상수 의 '+' 연결 을 직접 사용 하 는 것 이 가장 효율 적 입 니 다.
posted @
2018-03-08 11:35 neu_장 강 읽 기 (
...) 댓 글 (
...) 모음 집 편집
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.