StringBuilder를 어떻게 지우거나 비울 수 있습니까? [복제]
이 질문에 이미 답변이 있습니다.
- 루프 8 답변 후 문자열 버퍼 / 빌더 지우기
내가 사용하고 StringBuilder의 루프와 나는 그것을 비우고 빈으로 시작하려는 모든 X의 반복에를 StringBuilder
,하지만 난 .NET과 유사한 어떤 방법을 볼 수 없습니다 StringBuilder.Clear 문서에서 바로 삭제 보인다 방법을 지나치게 복잡합니다.
그렇다면 StringBuilder
Java에서 정리하는 가장 좋은 방법은 무엇 입니까?
작동하는 두 가지 방법 :
- 사용
stringBuilderObj.setLength(0)
. new StringBuilder()
버퍼를 지우는 대신 새 것을 할당하십시오 .
기본적으로 두 가지 대안이 있습니다 setLength(0)
. StringBuilder를 재설정하는 데 사용 하거나 반복 할 때마다 새로 만드는 것입니다. 둘 다 사용법에 따라 장단점이있을 수 있습니다.
StringBuilder의 예상 용량을 미리 알고있는 경우 매번 새 길이를 설정하는 것만 큼 빠릅니다. 각 StringBuilder는 상대적으로 수명이 짧고 gc가 이에 최적화되어 있기 때문에 가비지 수집기에도 도움이됩니다.
용량을 모르는 경우 동일한 StringBuilder를 재사용하는 것이 더 빠를 수 있습니다. 추가 할 때 용량을 초과 할 때마다 새 백업 어레이를 할당하고 이전 콘텐츠를 복사해야합니다. 동일한 StringBuilder를 재사용하면 몇 번의 반복 후에 필요한 용량에 도달하고 그 이후로는 복사 할 수 없습니다.
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)
새 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
쉬운 방법입니다.
여기 답변의 많은에 포함 된 품질의 방법을 누락 될 수 있습니다 생각 StringBuilder
: .delete(int start, [int] end)
. 나는 이것이 늦은 응답이라는 것을 안다. 그러나 이것은 알려야합니다 (좀 더 자세히 설명).
프로그램 전체에서 동적으로 수정하려는 StringBuilder 테이블이 있다고 가정 해 보겠습니다 (지금 작업중인 테이블이이 작업을 수행합니다). 예 :
StringBuilder table = new StringBuilder();
메소드를 반복하고 내용을 변경하고 내용을 사용 StringBuilder
하고 다음 반복을 위해 내용을 "정리"하기 위해 내용을 삭제하려면 내용을 삭제할 수 있습니다. 예를 들어
table.delete(int start, int end).
제거하려는 문자의 색인이 시작되고 끝납니다. 문자의 길이를 모르고 전체를 삭제하고 싶습니까?
table.delete(0, table.length());
자, 키커를 위해. StringBuilders
, 앞서 언급했듯이 자주 변경하면 많은 오버 헤드가 발생합니다 (스레딩과 관련하여 안전 문제를 일으킬 수 있음). 따라서 사용자와의 인터페이스를 위해 사용되는 경우와 StringBuffer
동일 StringBuilder
(몇 가지 예외 제외)을 StringBuilder
사용 하십시오 .
성능이 주요 관심사 인 경우 ... 아이러니 (IMO)는 버퍼 로 들어가는 텍스트를 형식화하는 Java 구조가 alloc / realloc / garbage 컬렉션보다 CPU에서 훨씬 더 많은 시간을 소비한다는 것입니다. 생성하고 폐기하는 빌더의 수에 따라 GC가 아닙니다.
But simply appending a compound string ("Hello World of " + 6E9 + " earthlings.") to the buffer is likely to make the whole matter inconsequential.
And, really, if StringBuilder's involved the content is complex and lengthy and longer than a simple String str = "Hi";
(never mind Java probably uses a builder in the background anyway).
Personally, I try not to abuse the GC. So if it's something that's going to be used a lot in rapid fire scenario - like, say, writing debug output messages ... I just assume declare it elsewhere and zero it out for reuse.
class MyLogger {
StringBuilder strBldr = new StringBuilder(256);
public LogMsg( String stuff ) {
strBldr.setLength(0);
// ... prepend status level
strBldr.append("Info");
// ... prepend timestamp
strBldr.append(" " + getTimestamp());
// ... user msg
strBldr.append(":" + msg);
log.write(strBldr.toString());
}
}
참고URL : https://stackoverflow.com/questions/5192512/how-can-i-clear-or-empty-a-stringbuilder
'code' 카테고리의 다른 글
예 : 메시징을 사용한 활동과 서비스 간의 통신 (0) | 2020.10.03 |
---|---|
Visual Studio에서 모든 대문자 메뉴 제목을 비활성화하는 방법 (0) | 2020.10.03 |
사전 매핑 반전 / 반전 (0) | 2020.10.03 |
git에서 별칭 명령을 어떻게 수행합니까? (0) | 2020.10.03 |
xcode-select 활성 개발자 디렉토리 오류 (0) | 2020.10.03 |