구별의 StringBuilder와 StringBuffer를뿐만 아니라 원칙

사실의 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 = 비정상을 설명했다. 마지막으로, 메모리 확장의 문자열 배열 값.

추천

출처blog.csdn.net/k393393/article/details/79078670