[java] 루프 후 문자열 버퍼 / 빌더 지우기

루프 후 Java에서 문자열 버퍼를 지우는 방법은 다음 반복에서 명확한 문자열 버퍼를 사용합니까?



답변

한 가지 옵션은 다음과 같이 삭제 방법을 사용하는 것입니다.

StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
   sb.append("a");

   // This will clear the buffer
   sb.delete(0, sb.length());
}

또 다른 옵션 (비트 클리너)은 setLength (int len) 사용합니다 .

sb.setLength(0);

자세한 정보는 Javadoc 을 참조하십시오 .


답변

를 재사용하는 가장 쉬운 방법 StringBuffer은 방법을 사용하는 것입니다.setLength()

public void setLength(int newLength)

다음과 같은 경우가있을 수 있습니다.

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb


답변

두 가지 옵션이 있습니다.

사용 :

sb.setLength(0);  // It will just discard the previous data, which will be garbage collected later.  

또는 다음을 사용하십시오.

sb.delete(0, sb.length());  // A bit slower as it is used to delete sub sequence.  

노트

루프 내에서 StringBuffer또는 StringBuilder객체를 선언하지 마십시오. 그렇지 않으면 반복 할 때마다 새 객체가 생성됩니다. 개체를 만들려면 시스템 리소스와 공간이 필요하며 시간도 걸립니다. 따라서 장기적으로 가능하면 루프 내에서 선언하지 마십시오.


답변

buf.delete(0,  buf.length());


답변

각 반복마다 새 StringBuffer(또는 더 나은 StringBuilder)를 만드는 것이 좋습니다 . 성능 차이는 정말 미미하지만 코드는 더 짧고 간단합니다.


답변

public void clear(StringBuilder s) {
    s.setLength(0);
}

용법:

StringBuilder v = new StringBuilder();
clear(v);

가독성을 위해 이것이 최선의 해결책이라고 생각합니다.


답변

이미 좋은 대답입니다. StringBuffer 및 StringBuild 성능 차이에 대한 벤치 마크 결과를 추가하면 루프에서 새 인스턴스를 사용하거나 루프에서 setLength (0)을 사용합니다.

요약 : 큰 루프에서

  • StringBuilder는 StringBuffer보다 훨씬 빠릅니다.
  • 루프에서 새 StringBuilder 인스턴스를 만드는 것은 setLength (0)과 차이가 없습니다. (setLength (0)은 새 인스턴스를 만드는 것보다 매우 작은 이점이 있습니다.)
  • StringBuffer는 루프에서 새 인스턴스를 생성하여 StringBuilder보다 느립니다.
  • StringBuffer의 setLength (0)은 루프에서 새 인스턴스를 만드는 것보다 매우 느립니다.

매우 간단한 벤치 마크 (수동으로 코드를 변경하고 다른 테스트를 수행함) :

public class StringBuilderSpeed {
public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'};

public static void main(String a[]){
    int loopTime = 99999999;
    long startTime = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    for(int i = 0 ; i < loopTime; i++){
        for(char c : ch){
            sb.append(c);
        }
        sb.setLength(0);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("Time cost: " + (endTime - startTime));
}

}

루프의 새 StringBuilder 인스턴스 : 시간 비용 : 3693, 3862, 3624, 3742

StringBuilder setLength : 시간 비용 : 3465, 3421, 3557, 3408

루프의 새 StringBuffer 인스턴스 : 시간 비용 : 8327, 8324, 8284

StringBuffer setLength 시간 비용 : 22878, 23017, 22894

다시 StringBuilder setLength는 내 labtop이 StringBuffer setLength에 대해 그렇게 오래 사용하는 데 문제가 있는지 확인합니다. 🙂 시간 비용 : 3448