기록/JAVA

[JAVA] StringBuilder의 insert, append

5월._. 2022. 3. 10.
728x90

insert

StringBuilder의 insert메서드는 다시 AbstractStringBuilder의 insert메서드를 실행한다.

insert 메서드 내에서 직접 한 번, str.getChars() 메서드 안에서 한 번 호출되어 총 System.arraycopy() 메서드가 두 번 호출된다.

//AbstractStringBuilder.java 클래스
public AbstractStringBuilder insert(int offset, String str) {
    if ((offset < 0) || (offset > length()))
        throw new StringIndexOutOfBoundsException(offset);
    if (str == null)
        str = "null";
    int len = str.length();
    ensureCapacityInternal(count + len);
    System.arraycopy(value, offset, value, offset + len, count - offset);
    str.getChars(value, offset);
    count += len;
    return this;
}
//String.java클래스
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}

 

append

StringBuilder의 append 메서드는 AbstractStringBuilder의 append를 실행하고, 그 메서드는 다음과 같다.

//AbstractStringBuilder.java 클래스
public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
//String.java클래스
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
    if (srcBegin < 0) {
        throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > value.length) {
        throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
        throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}

 

따라서, insert 메서드는 System.arraycopy를 두 번 사용하므로 System.arraycopy를 한 번만 사용하는 append 메서드보다 실행시간이 더 느리다. 

댓글