루프 후 문자열 버퍼/빌더 지우기
다음 반복에서는 클리어 스트링 버퍼를 사용하기 위해 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
루프 내의 오브젝트, 그렇지 않으면 반복마다 새로운 오브젝트가 생성됩니다.개체를 만들려면 시스템 리소스 및 공간이 필요하며 시간도 걸립니다.따라서 장기적으로는 가능하면 루프 내에서 선언하지 마십시오.
public void clear(StringBuilder s) {
s.setLength(0);
}
사용방법:
StringBuilder v = new StringBuilder();
clear(v);
가독성을 위해서는 이것이 가장 좋은 해결책이라고 생각합니다.
새로 만들 것을 제안합니다.StringBuffer
(또는 더 좋은 것은 )를 각 반복에 사용합니다.성능 차이는 거의 없지만 코드가 더 짧고 단순해집니다.
buf.delete(0, buf.length());
그건 이미 좋은 대답이야.StringBuffer와 StringBuild의 성능 차이에 대한 벤치마크 결과를 추가하면 루프에서 새 인스턴스를 사용하거나 루프에서 setLength(0)를 사용할 수 있습니다.
요약은 다음과 같습니다.큰 루프에서
- String Builder는 String Buffer보다 훨씬 빠릅니다.
- 루프에서 새 String Builder 인스턴스를 생성해도 setLength(0)와 차이가 없습니다.(setLength(0)는 새로운 인스턴스를 작성하는 것보다 매우 작은 이점이 있습니다).
- 루프에서 새 인스턴스를 생성함으로써 StringBuilder보다 StringBuffer가 느립니다.
- 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
String Builder set Length:시간 비용: 3465, 3421, 3557, 3408
루프의 새 StringBuffer 인스턴스:시간 비용: 8327, 8324, 8284
StringBuffer setLength 시간 비용: 22878, 23017, 22894
다시 String Builder set Length를 사용하여 랩탑이 String Buffer set Length:-) 시간 비용: 3448에 문제가 발생하지 않도록 합니다.
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
이 코드가 더 빠른 것 같아요.
아래 코드를 사용하여 regex 매칭과 같은 임시 처리를 위한 비밀번호를 저장하고 완료 후 지웁니다.일반적인 삭제 방법으로는 모든 문자가 리셋되지 않습니다.이것은 나에게 적합하지 않았습니다.이 코드는 나의 요구를 충족시켰다.
public static void clear(StringBuilder value) {
for (int i = 0, len = value.length(); i < len; i++) {
value.setCharAt(i, Character.MIN_VALUE);
}
value.setLength(0);
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("clear this password");
// use & process sb
clear(sb);
}
StringBuilder
Clear()
★★★★★★ 。
StringBuilder sb = new StringBuilder();
sb.Clear();
언급URL : https://stackoverflow.com/questions/2242471/clearing-a-string-buffer-builder-after-loop
'source' 카테고리의 다른 글
JAR 파일 외부에서 속성 파일을 읽습니다. (0) | 2023.01.29 |
---|---|
PHP는 에 상당합니다.NET/Java의 toString() (0) | 2023.01.29 |
사전 대신 명명된 튜플을 사용해야 하는 시기와 이유는 무엇입니까? (0) | 2023.01.29 |
vuejs v-for에 :key 속성이 필요한 이유는 무엇입니까? (0) | 2023.01.29 |
PHP 기본 도메인/url을 가져오는 방법 (0) | 2023.01.29 |