자바 문자열 연결 의 우아 한 방식 인 스 턴 스 상세 설명

배경
문자열 맞 춤 법 은 업무 적 으로 나 알고리즘 을 쓸 때 자주 사용 된다.자바 에 게 문자열 연결 은 여러 가지 방식 이 있 습 니 다.그들 사이 의 차 이 는 무엇 입 니까?서로 다른 업무 에 대응 하 는 것 이 어떤 것 이 더 좋 습 니까?
String 바 텀 원리
문자열 의 연결 을 토론 할 때 먼저 String 의 기본 원 리 를 알 아야 합 니 다.
jdk 1.8 이후 의 상황 만 논의 하고 구 조 를 살 펴 보 겠 습 니 다.

private final byte[] value;
이 줄 의 코드 는 이미 많은 것 을 설명 할 수 있다.문자열 은 실질 적 으로 변 하지 않 는 byte 배열 입 니 다.가 변 적 이지 않 기 때문에 그 를 맞 추 는 것 은 실제 적 으로 여러 개의 대상 을 만 드 는 것 이다.이것 이 바로 문자열 을 맞 추 는 것 을 장려 하지 않 는 이유 이다.그러나 가 변 적 이지 않 은 것 도 좋 은 점 이 많다.예 를 들 어 스 레 드 가 안전 하고 문자열 버퍼 가 존재 할 수 있 는 문자열 등 이다.
맞 춤 법
클래식 하지만 때로는 우아 하지 않 은+

String a = "123";
String b = "456";
String c = a + b;
c 이 문자열 은 ab 로 연 결 된 문자열 입 니 다."123456"
이 코드 가 역 컴 파일 된 코드 는?

String c = (new StringBuilder()).append(a).append(b).toString();
​
이+는 자바 의 문법 사탕 임 을 알 수 있 습 니 다.그 는 실제로 StringBuilder 를 호출 하여 append()를 통 해 연결 합 니 다.StringBuilder 에 대해 서 는 나중에 말씀 드 리 겠 습 니 다.먼저 이 용법 의 장단 점 을 말씀 드 리 겠 습 니 다.
장점.
'+'의 가장 큰 장점 은 간결 함 이다.만약 두 문자열 이 처음 과 끝 을 연결 해 야 한다 면+번 호 는 도의 상 거절 할 수 없 는 가장 좋 은 사용 방식 이 되 었 다.
결점.
결점 을 말 하면 말 이 많아 진다.간결 함 도 그의 가장 큰 단점 이다.즉,융통성 이 부족 하 다 는 것 이다.
업무
문자열 List 가 있 습 니 다.그들 을 연결 해 야 합 니 다.어떻게 해 야 합 니까?

for(String tmp:list){
    s += tmp;
}
간결 한 부분 이지 만 그 는 매우 큰 문 제 를 숨 기 고 있다!
위 에서 말 한 바 와 같이 이런 조합 방식 은 실제 적 으로 StringBuilder 의 append 를 통 해 이 루어 지 는 방법 이다.당신 은 그의 원 리 를 알 필요 가 없습니다.순환 할 때마다 그 는 new StringBuilder 대상 을 알 아야 합 니 다.생 성 대상 의 비용 은 매우 큽 니 다.만약 List 가 수천 만 위안 이 있다 면 메모리 비용 과 시간 비용 은 받 아들 일 수 없습니다!
그래서 알 리 바 바 의 규범 은 다음 과 같다.

겉 으로 는 추천 이지 만 실제로는 금지 다.알고리즘 을 쓰 는 데 많은 시간 을 소모 하여 통과 하지 못 하 게 할 수 있 고 업무 도 이런 방식 으로 이유 없 는 비용 을 올 렸 기 때문에 지도자 가 죽 이 고 싶 은 코드 를 본 것 이다.
업무
안녕하세요,저 는 XX 라 고 합 니 다.저 는 XXX 학교 에서 온 X 학생 입 니 다.제 취 미 는 XXX 입 니 다.
전형 적 인 템 플 릿 입 니 다.중간 에 있 는 XXX 를 controller 로 바 꿔 야 합 니 다.어떻게 해 야 합 니까?

String s = "   ,  "+name+"    "+school+"    "+num+“  ,     ”+aihao;
사용 가능 하지만 매우 추 한 코드 에 속 합 니 다.만약 다른 인터페이스 에 도 이 템 플 릿 이 필요 하 다 면,나 는 이 말 을 모든 위치 로 복사 해 야 합 니까?만약 내 가 이것 을 바 꾸 려 고 한다 면,나 는 모든 코드 를 바 꾸 어야 합 니까?
만능 StringBuilder
먼저 StringBuilder 의 원 리 를 소개 하 겠 습 니 다.문자열 을 배열 로 상상 하면 이해 하기 쉽 습 니 다.StringBuilder 는 Array List,가 변 배열 과 유사 합 니 다.

    /**
     * The value is used for character storage.
     */
    char[] value;
차이 점 은 final 수식 이 없 이 한도 값 에 도 착 했 을 때 확장 작업 을 하 는 것 이다.append 방법 은 뒤로 삽입 하 는 것 입 니 다.
그럼 위의 업무 1 문 제 를 해결 할 수 있 습 니 다.

StringBuilder sb = new StringBuilder();
for(String tmp:list){
    sb.append(tmp);
}
String s = sb.tostring();
위 에 비해 StringBuilder 대상 만 만 만 들 었 고 순환 적 으로 만 드 는 비용 을 줄 였 습 니 다.
안전 한 스 레 드 StringBuffer
StringBuffer 는 StringBuilder 에 비해 스 레 드 가 안전 하 다 는 장점 이 있 으 며 잠 금 방식 을 통 해.동시에 효율 이 StringBuilder 보다 약간 낮 습 니 다.
유연 한 String.format()
이것 은 엄 밀 히 말 하면 포맷 이 라 고 해 야 하지만 맞 추 는 데 도 쓸 수 있다.
c 언어 를 잘 아 는 사람 은 알 수 있 을 것 입 니 다.제 가 예 를 들 겠 습 니 다.

String msg = String.format(“  %s     ,   %s”,"  "," ");
//            ,    
%s 대신 문자열 체인 을 사용 하여 필요 한 문자열 을 생 성 합 니 다.문자열 을 맞 출 수 있 을 뿐만 아니 라 다음 그림 도 볼 수 있 습 니 다.

이런 방식 으로 업무 2 의 문 제 를 해결 했다.매 거 진 문자열 이나 상수 문자열 을 작성 하여 해당 하 는 위 치 를 남 겨 두 고 사용 할 때 String.format()으로 연결 합 니 다.
약간 초록색 concat.
왜 그 가 녹색 이 라 고 말 합 니까?바로 나 는 아직 그 가 어떤 장점 을 가지 고 있 는 지 찾 지 못 했 습 니 다.

String s = "123".concat("456");
//     
String s = "123" + "456";
concat 방법의 원 리 는 배열 확장 후 이전 내용 을 복사 하고 새로운 내용 을 쓰 는 것 으로 StringBuilder 밑 층 과 비슷 하 다.
그러나'+'호 에 비해 간편 하지 도 않 고 효율 적 인 향상 도 없다.순환 문자열 을 연결 하 는 조건 에 서 는 효율 적 으로 약간의 장점 이 있 지만,이러한 상황 은 전혀 허용 되 지 않 기 때문에 concat 는 매우 취약 하 다.
JDK 1.8 우아 한 표기 법
방금 업무 1 의 해결 방법 은 소박 한 StringBuilder 로 해결 할 수 있 지만 업무 코드 에 있어 서 는 좀 지루 합 니 다.
Jdk 1.8 은 우아 한 답 을 주 었 습 니 다.

String s = String.join("_", list);
코드 한 줄 로 list 의 문자열 을""을 통과 할 수 있 습 니 다.연결 하 다.
고전적 인 Guava
guava 는 우리 crud 프로그래머 의 좋 은 파트너 입 니 다.여 기 는 더 이상 말 할 필요 가 없습니다.우리 가 가장 자주 접 하 는 것 은 바로 guava 의 로 컬 캐 시 와 문자열 작업 입 니 다.

String result = Joiner.on(",").join(list);
또한 간결 한 한 마디 이지 만 jdk 본토의 문자열 방법 에 비해 그 는 또 다른 특성 이 있다.예 를 들 어 null 인 배열 을 건 너 뛰 거나 교체 할 수 있 습 니 다.jdk 보다 기능 이 풍부 합 니 다.정상 적 인 웹 프로젝트 에 서 는 기본적으로 Guava 의 의존 이 있 기 때문에 사용 하기에 매우 편리 하 다.
총결산
이 글 은 코드 작성 에 치중 하고 간결 하고 효율 적 인 코드 를 어떻게 쓰 는 지 우리 가 추구 해 야 할 것 이다.네가 쓴 스 팸 코드 를 인수 하 는 동료 에 게 구역질 나 게 하지 않 았 으 면 좋 겠 다.
자바 문자열 을 연결 하 는 우아 한 방식 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 문자열 의 연결 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기