차
사실의 StringBuilder와 StringBuffer를 사용에서 좀 더 일반적으로 모두 StringBuilder를 사용하고, 같은, 거의 아무것도 다릅니다. 그러나 결국 그들은 그 예 확실히, 그들 사이의 차이가 없다 말한다. StringBuffer를 스레드 안전하므로 대부분의 StringBuffer 방법은, 수정 된 동기화되지만, 그것은 변형되어 있기 때문에, 매우 효율 StringBuffer와 StringBuilder의 바닥의 비율이다.
StringBuilder의 원리
소스 코드를 살펴 것 모두 StringBuilder의 StringBuilder의 원리를 공부합니다.
StringBuilder의 문자의 배열을 정의하는 정의하고, 배열 길이는 가변적이며, 그 길이는 카운트
char[] value;
int count;
먼저 새의 StringBuilder 객체
StringBuilder sb = new StringBuilder();
모두 StringBuilder 생성자, 기본 크기는 16 바이트 16 개 문자의 배열을 만드는 것입니다
public StringBuilder() {
super(16);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
모두 StringBuilder APPEND 방법
private StringBuilder append(StringBuilder sb) {
if (sb == null)
return append("null");
int len = sb.length();
int newcount = count + len;
if (newcount > value.length)
expandCapacity(newcount);
sb.getChars(0, len, value, count);
count = newcount;
return this;
}
추가] 문자열은 제 SB 비어 아니라면 비어 이미 접합 길이의 StringBuilder SB를 수득하고 있는지 여부를 판단 할 때 문자열 길이, 즉 newcount를, 만약 문자열 배열 newcount를 (값)보다 길이, 다음 expandCapacity 용량을 확장하여 사용합니다. 마지막 sb.getChars ()를 사용하여 새로운 문자열은 문자열 배열 (값)의 값에 더해지는 부가 카운트 newcount를 부여한다.
private void ensureCapacityInternal(int minimumCapacity) {
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
차례로 ensureCapacityInternal는 방법 expandCapacity를 호출
oid expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
제 1의 확장 부 (16) * 2 + 2 바이트 용량 (34 바이트), 그리고는 문자열 연결 StringBuilder의 길이 (길이 + 새로운 문자열을 추가)보다 새로운 바이트 확장, 그 미만인지 여부를 판정한다 문자열의 길이는 다음 새 확장 된 길이 newCapacity는 바느질에 StringBuilder에 주어진. newCapacity 경우 <0 OOM는 (메모리가 충분하지 않다)을 이번에는 Integer.MAX_VALUE newCapacity = 비정상을 설명했다. 마지막으로, 메모리 확장의 문자열 배열 값.