>  기사  >  Java  >  Java 8에서는 문자열을 연결하는 데 더 이상 StringBuilder가 필요하지 않습니다.

Java 8에서는 문자열을 연결하는 데 더 이상 StringBuilder가 필요하지 않습니다.

巴扎黑
巴扎黑원래의
2017-04-30 10:13:201689검색

Java 개발자들 사이에서는 스트링 스플라이싱의 높은 리소스 소비가 종종 화제가 됩니다.

왜 그렇게 많은 리소스를 차지하는지 심층적으로 논의해 보겠습니다.

Java에서 문자열 객체는 불변입니다. 즉, 일단 생성되면 변경할 수 없습니다. 따라서 문자열을 연결하면 새 문자열이 생성되고 이전 문자열은 가비지 수집기에 의해 표시됩니다.

수백만 개의 문자열을 처리하면 가비지 수집기에서 처리할 수백만 개의 추가 문자열을 생성하게 됩니다.

가상 머신의 맨 아래 계층은 문자열을 연결할 때 많은 작업을 수행합니다. 문자열을 연결하는 가장 직접적인 도트 연산자는 String#concat(String) 작업입니다.

아아아아아아아아아아

문자 배열이 생성된 것을 볼 수 있으며, 길이는 기존 문자와 연결 문자의 길이를 합한 값입니다. 그런 다음 해당 값이 새 문자 배열에 복사됩니다. 마지막으로 이 문자 배열에서 String 객체를 생성하고 반환합니다.

따라서 이러한 연산은 매우 다양합니다. 계산해 보면 복잡성이 O(n^2)라는 것을 알 수 있습니다.

​이 문제를 해결하기 위해 StringBuilder 클래스를 사용합니다. 이는 변경 가능한 String 클래스와 같습니다. 접합 방법은 불필요한 중복을 방지하는 데 도움이 됩니다. 이는 O(n^2)보다 훨씬 더 나은 O(n)의 복잡성을 갖습니다.

그러나 Java 8은 기본적으로 StringBuilder를 사용하여 문자열을 연결합니다.

Java 8 문서:

문자열 연결 성능을 향상시키기 위해 Java 컴파일러는 StringBuffer 클래스 또는 유사한 기술을 사용하여 평가 표현식을 사용할 때 중간 String 객체 생성을 줄일 수 있습니다.

Java 컴파일러는 이 상황을 처리합니다.

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

위 코드는 다음 바이트코드로 컴파일됩니다:

public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

​이 바이트코드에서 StringBuilder가 사용되는 것을 볼 수 있습니다. 따라서 Java 8에서는 더 이상 StringBuilder 클래스를 사용할 필요가 없습니다.

영어 원문: 더 이상 연결을 위해 StringBuilder가 필요하지 않습니다

위 내용은 Java 8에서는 문자열을 연결하는 데 더 이상 StringBuilder가 필요하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.