programing

String Builder를 지우거나 비우려면 어떻게 해야 합니까?

prostudy 2022. 7. 18. 22:08
반응형

String Builder를 지우거나 비우려면 어떻게 해야 합니까?

루프에서 String Builder를 사용하고 있으며, 빈 상태로 시작하고 싶은 반복 횟수마다 String Builder입니다.StringBuilder와 유사한 메서드는 표시되지 않습니다.NET String Builder.문서에는 너무 복잡해 보이는 삭제 방법만 명시되어 있습니다.

그럼 어떻게 하면 가장 좋은 청소가 될까요?StringBuilder자바어?

다음 두 가지 방법으로 동작:

  1. 사용하다stringBuilderObj.setLength(0).
  2. 새 할당:new StringBuilder()버퍼를 클리어하는 대신.퍼포먼스가 중요한 코드 패스의 경우, 이 어프로치에서는, 이 어프로치의 속도가, 이 어프로치보다 큰폭으로 늦어질 가능성이 있습니다.setLength-based 어프로치(새로운 버퍼를 가진 새로운 오브젝트를 할당해야 하므로 오래된 오브젝트는 GC 등의 대상이 됩니다).

기본적으로 두 가지 대안이 있습니다.setLength(0)String Builder를 리셋하거나 각 반복에서 새 String Builder를 만듭니다.둘 다 용도에 따라 장단점이 있을 수 있습니다.

StringBuilder의 예상 용량을 미리 알고 있는 경우 매번 새 용량을 작성하는 것은 새 길이를 설정하는 것만큼 빠릅니다.또한 각 String Builder는 비교적 수명이 짧고 GC는 이에 최적화되어 있기 때문에 가비지 컬렉터에도 도움이 됩니다.

용량을 모를 경우 동일한 String Builder를 재사용하는 것이 더 빠를 수 있습니다.추가할 때 용량을 초과할 때마다 새 백업 어레이를 할당하고 이전 컨텐츠를 복사해야 합니다.같은 String Builder를 재사용하면 몇 번 반복하면 필요한 용량에 도달하고 그 이후에는 복사가 발생하지 않습니다.

delete는 그다지 복잡하지 않습니다.

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

다음 작업도 수행할 수 있습니다.

myStringBuilder.setLength(0);

StringBuilder 또는 StringBuffer 소스 코드를 보면 setLength() 호출은 문자 배열의 인덱스 값을 리셋합니다.setLength 메서드를 사용하는 IMHO는 항상 새로운 할당보다 빠릅니다.그들은 그 방법을 'clear' 또는 'reset'이라고 이름 지었어야 했다.

투표하겠습니다.sb.setLength(0);하나의 함수 호출일 뿐만 아니라 실제로 어레이를 다른 어레이로 복사하지 않기 때문입니다.sb.delete(0, builder.length());. 나머지 문자를 0으로 채우고 길이 변수를 새 길이로 설정합니다.

다음 웹 사이트에서 구현 내용을 살펴보고 제 요점을 검증할 수 있습니다.setLength기능 및delete0기능.

를 사용해 주세요.sb.delete(0, sb.length())또는sb.setLength(0)새로운 String Builder()를 작성하지 마십시오.

퍼포먼스에 대해서는, 다음의 관련의 투고를 참조해 주세요.String Builder를 루프에서 재사용하는 것이 좋습니까?

여기 있는 답변의 대부분은 품질에 관한 방법이 포함되어 있지 않을 수 있습니다.StringBuilder:.delete(int start, [int] end)답변이 늦었다는 것은 알지만, 이 점에 대해 좀 더 자세히 설명해야 합니다.

예를 들어 String Builder 테이블이 있다고 가정해 보겠습니다.이 테이블은 프로그램 전체에서 동적으로 수정됩니다(현재 작업 중인 테이블은 다음과 같습니다).

StringBuilder table = new StringBuilder();

메서드를 루핑하여 콘텐츠를 변경하는 경우 콘텐츠를 폐기하고 다음 콘텐츠의 "정리"를 수행합니다.StringBuilder다음 반복에서는 내용을 삭제할 수 있습니다(예:

table.delete(int start, int end). 

start 및 end는 제거할 문자 색인이 됩니다.문자 길이를 알 수 없으며 전체 문자를 삭제하시겠습니까?

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

자, 킥커를 위해. StringBuilders앞에서 설명한 바와 같이 자주 변경할 경우 많은 오버헤드를 필요로 합니다(또한 스레드화와 관련하여 안전상의 문제를 일으킬 수 있습니다).따라서,StringBuffer- 와 같다StringBuilder(몇 가지 예외를 제외하고) - 만약StringBuilder는 사용자와의 인터페이스 목적으로 사용됩니다.

StringBuilder s = new StringBuilder();
s.append("a");
s.append("a");
// System.out.print(s); is return "aa"
s.delete(0, s.length());
System.out.print(s.length()); // is return 0

쉬운 방법입니다.

퍼포먼스가 주된 관심사라면 아이러니하게도 버퍼에 들어가는 텍스트를 포맷하기 위한 Java 구조가 할당/재할당/쓰레기 컬렉션보다 CPU에 훨씬 더 많은 시간이 소요된다는 것입니다.생성하고 폐기하는 빌더의 수에 따라서는 GC(쓰레기 컬렉션)가 아닌 경우가 있습니다.

그러나 단순히 복합 문자열을 추가하는 것("Hello World of " + 6E9 + " earthlings."버퍼에 대한 )는 전체 문제를 중요하지 않게 만들 수 있습니다.

그리고, 정말, 만약 한 예가StringBuilder내용이 복잡하거나 단순한 내용보다 긴 경우String str = "Hi";(Java는 백그라운드에서 빌더를 사용하고 있을 가능성이 있습니다).

개인적으로, 나는 GC를 남용하지 않으려고 노력한다.디버깅 출력 메시지 작성과 같은 빠른 화재 시나리오에서 많이 사용되는 경우 다른 곳에 선언하고 0으로 설정하여 재사용할 수 있습니다.

class MyLogger {
    StringBuilder strBldr = new StringBuilder(256);

    public void logMsg( String stuff, SomeLogWriterClass log ) {

        // zero out strBldr's internal index count, not every
        // index in strBldr's internal buffer
        strBldr.setLength(0);

        // ... append status level
        strBldr.append("Info");

        // ... append ' ' followed by timestamp
        // assuming getTimestamp() returns a String
        strBldr.append(' ').append(getTimestamp());

        // ... append ':' followed by user message
        strBldr.append(':').append(msg);

        log.write(strBldr.toString());
    }
}

언급URL : https://stackoverflow.com/questions/5192512/how-can-i-clear-or-empty-a-stringbuilder

반응형