String Builder를 지우거나 비우려면 어떻게 해야 합니까?
루프에서 String Builder를 사용하고 있으며, 빈 상태로 시작하고 싶은 반복 횟수마다 String Builder입니다.StringBuilder
와 유사한 메서드는 표시되지 않습니다.NET String Builder.문서에는 너무 복잡해 보이는 삭제 방법만 명시되어 있습니다.
그럼 어떻게 하면 가장 좋은 청소가 될까요?StringBuilder
자바어?
다음 두 가지 방법으로 동작:
- 사용하다
stringBuilderObj.setLength(0)
. - 새 할당:
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
'programing' 카테고리의 다른 글
휴지 상태에서의 지연 로딩이란 무엇입니까? (0) | 2022.07.18 |
---|---|
OSGi는 무엇을 해결합니까? (0) | 2022.07.18 |
날짜를 해석하는 방법? (0) | 2022.07.18 |
vue-disable을 사용하지 않도록 설정할 수 없음 (0) | 2022.07.18 |
VueJS 구문: 마운트에서 실행 중인 메서드 (0) | 2022.07.18 |