StringBuffer 와 StringBuilder 의 확장 문 제 를 해결 합 니 다.

StringBuffer 와 StringBuilder 의 확장
예전 에는 StringBuffer/stringBuilder 에 대해 처음 알 았 을 뿐 StringBuffer 는 스 레 드 가 안전 하고 Stringbuilder 는 비 스 레 드 가 안전 하 다 는 것 만 알 았 습 니 다.또한 문자열 길 이 는 가 변 적 입 니 다.
구체 적 으로 어떻게 변 했 는 지 깊이 이해 하지 못 하고 오늘 소스 코드 를 보고 문득 크게 깨 달 았 다.
원본 코드 를 살 펴 보 겠 습 니 다.전송 되 지 않 은 상태 에서 기본 초기 용량 은 16 입 니 다.

인자 가 있 는 경우 초기 용량 은 16+문자열 의 길이 이 며 append()방법 으로 추 가 된 문자 입 니 다.

여기까지 의문 입 니 다.그럼 이 문자열 의 길 이 는 얼마 입 니까?그 자체 의 길이 인지 16+그 자체 의 길이 인지 이어서 내 려 다 보 세 요.append()방법 을 찾 아 마침내 답 을 찾 았 다.
주의 하 세 요.이 렌 이 String 자체 의 길이 라 니,이제 알 겠 죠?사실 평소에 도 str.length()를 사용 합 니 다.방법 은 그것 의 길이 가 어떻게 생 겼 는 지 주의 하지 않 는 것 이다.

갑자기 또 하나의 문제 가 생각 났 다.만약 에 문자열 을 추가 할 때 길이 가 16 보다 크 면 어 떡 하지?우 리 는 ensureCapacity Internal()의 방법 을 보고 따라 들 어가 보 니 이렇게 확대 되 었 다.

int newCapacity = (value.length << 1) + 2;
자신의 길이 의 배로 늘 리 고 2 추가 하기;이때 도 놓 을 수 없다 면 필요 한 길이 로 바로 확장 하 라.

newCapacity = minCapacity;



StringBuilder 확장 규칙
StringBuilder 기본 생 성 시 열 린 char 배열 의 크기

StringBuilder() default 16
StringBuilder("Str") default Str.length()+16
StringBuilder sb 확장 규칙:
sb.append()를 호출 할 때 매번 현재 용량 을 판단 합 니 다.
StringBuilder.append
필요 한 최소 용량(저 장 된 데이터 길이+저 장 된 데이터 의 길이)이 저 장 된 char 배열 의 길이 보다 큰 지 확인 하 십시오.크 면 new Capacity 에서 확장 합 니 다.
ensureCapacityInternal
현재 char 배열 길이 의 2 배+2 의 길이 가 확장 수 요 를 만족 시 키 는 지,저 장 된 데이터 길이+저 장 된 데이터 의 길 이 를 만족 시 키 지 못 하 는 지 판단 하여 append 확장 이 MAX 를 초과 하 는 지 판단 합 니 다.ARRAY_SIZE(Integer.MAX_VALUE-8),이상 을 던 지 는 경우 OutOf Memory Error
newCapacity
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기