JavaRush /Java Blog /Random-KO /문자열 += 문자열 또는 StringBuilder.append(String)?
SemperAnte
레벨 4
Донецк

문자열 += 문자열 또는 StringBuilder.append(String)?

Random-KO 그룹에 게시되었습니다
이 기사에서는 클래스의 추가 메소드와 의 StringBuilder연산자 의 차이점이 무엇인지 고려하고 분석하고 설명하고 보여주고 싶습니다 . 여기서 질문은 코드 최적화만큼 적용 영역에 관한 것이 아닙니다. +=String
문자열 += 문자열 또는 StringBuilder.append(String)?  - 1
예, 의심할 여지없이 이 질문에 깊이 들어가지 않은 사람은 다음과 같이 말할 것입니다: "왜 완전히 다른 클래스의 새 개체를 생성하여 += 연산자를 대체한 다음 메서드도 호출해야 합니까 toString()? 우리는 어떤 종류의 최적성입니까? 무슨 말을 하는 거야? 선택은 뻔한데 무슨 소리를 하는 거야?” 그러면 그는 완전히 틀렸을 것입니다. 문제 중 하나는 String원시적이지 않다는 것입니다. String- Java의 다른 객체 class와 마찬가지로 Java에는 연산자 오버로딩(예: C++에서와 같이)과 같은 것이 없으며 연산자는 기본 요소에 대해서만 정의되며 모든 클래스에 대해 어떤 연산자도 재정의할 수 없습니다. 이것이 바로 연산자 " +" 및 " += "가 Java 라이브러리의 일종의 "버팀목"이고 버팀목이 항상 손실을 초래하는 이유입니다. 실제로 고양이 꼬리 당기는 것을 멈추고 측정으로 넘어 갑시다. 다음은 루프 변수가 100,000번 있는 라인을 "접착"하는 데 걸리는 시간을 측정하는 간단한 프로그램입니다.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
내 컴퓨터의 콘솔에는 6815ms가 표시되었습니다. 즉, 내 컴퓨터가 이 선을 연결하는 데 거의 7초가 걸렸습니다. toString()이제 이를 StringBuilder로 바꾸고 측정에 메서드를 포함해 보겠습니다 .
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
내 PC에서 10ms라고 했어요. 즉, 0.01초입니다. 실제로 보면 차이가 꽤 나는 것 같은데, 대략적으로 말하면 700배 append더 빠르게 작동했습니다. +이는 " " 및 " +=" 자체가 동일한 추가를 호출할 수 있지만 동시에 그러한 연산자가 존재하고 무엇인지 이해하기 위해 언어의 목발을 통해 먼 길을 갔기 때문입니다 . 해야 합니다(마지막 단락은 추측일 뿐입니다. 저는 JVM 개발자가 아니며 거기에 무엇이 있고 어떻게 있는지 모릅니다). 이는 추가 개체가 항상 비용이 많이 드는 것은 아니라는 사실을 보여주는 명확한 예입니다. 예, 코드는 몇 줄 더 길어지지만 대규모 프로젝트에서는 엄청난 시간 절약 효과를 얻을 수 있습니다. 선사 시대 프로세서가 탑재된 사무용 PC에서는 측정한 것이 아니지만 이제 스카프를 거의 당길 수 없는 바로 이 사무용 컴퓨터에서 어떤 변화가 생길지 상상해 보세요.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION