String, String Buffer 및 String Builder
String,StringBuffer , , , , 입니다.StringBuilder
가변성의 차이:
String값을 변경하려고 하면 다른 오브젝트가 생성됩니다.StringBuffer ★★★★★★★★★★★★★★★★★」StringBuilder값을 변경할 수 있습니다.
스레드-안전성의 차이:
「 」의 StringBuffer ★★★★★★★★★★★★★★★★★」StringBuilder라는 것이다.StringBuffer스레드 세이프입니다.해야 할 을 사용하는 .StringBuilderStringBuilder입니다.StringBuffer.
상황:
- 되지 않을 합니다.String은 String이다.
String오브젝트는 불변입니다. - 변경할 수 를 들어1개의 할 수 있습니다.이 경우, 「」( 「」는 「」( 「 」( 「 」( 「 」)는 「 」1」입니다.
StringBuilder분합니니다다 - 변경할 수 스레드에서 를 합니다.
StringBufferStringBuffer동기화되어 있기 때문에 스레드 안전성이 확보됩니다.
- 불변의 구조가 적절할 때 사용합니다.즉, 에서 새로운 문자 시퀀스를 취득합니다.
String는 CPU 시간 또는 메모리에서 허용할 수 없는 성능 저하를 초래할 수 있습니다(데이터는 복사되지 않기 때문에 서브스트링을 사용하는 것이 CPU 효율적입니다만, 이것은 잠재적으로 훨씬 더 많은 양의 데이터가 할당되어 있는 것을 의미합니다). - 일반적으로 여러 문자 시퀀스를 연결하는 데 사용되는 가변 문자 시퀀스를 만들어야 할 때 사용합니다.
- 사용하는 것과 같은 환경에서 사용하는 경우
StringBuilder단, 기본 문자열에 대한 변경을 동기화해야 하는 경우(여러 스레드가 문자열 버퍼를 읽고 있기 때문에).
예를 들어 보겠습니다.
기본:
String불변의 클래스이기 때문에 변경할 수 없습니다.StringBuilder 에 추가할 수 있는 가변 클래스입니다.문자는 치환 또는 삭제되어 최종적으로 변환됩니다.String StringBuffer는, 의 원래 동기 입니다.StringBuilder
하다 보면 더 좋을 것 요.StringBuilder오브젝트에 액세스하는 스레드가1개밖에 없는 모든 경우.
상세:
, 「 」, 「 」라고 하는 도 주의해 주세요.StringBuilder/Buffers마법이 아니라 어레이를 백업 개체로 사용할 뿐이며, 어레이가 가득 찰 때마다 어레이를 다시 할당해야 합니다..StringBuilder/Buffer 큰 됩니다..append()출됩니니다다
을 사용하다기본적으로 백업 어레이를 확장할 때마다 크기가 현재 크기의 2배로 재조정됩니다.로 인해 수 .StringBuilder/Buffer수업은 커지기 시작한다.
String x = "A" + "B";는 을 합니다.StringBuilder에는 자기것을 이 되지 않습니다.따라서 간단한 경우 자신의 사례를 선언하는 것은 아무런 이득이 없습니다., 지지 but but but를 구축하고 있는 String4k를 합니다.StringBuilder sb = StringBuilder(4096);는 연결이나 기본 생성자(16자)를 사용하는 것보다 훨씬 효율적입니다.만약 당신이String10만엔에 달하다안전성을 위해 컨스트럭터와 함께 10k로 초기화합니다.그러나 10k로 초기화할 경우 10k보다 1글자를 더 쓰면 20k 배열로 재할당되어 복사됩니다.따라서 로우보다는 하이로 초기화하는 것이 좋습니다.
자동 크기 변경의 경우는, 17번째 문자에서는, 백업 어레이가 32자로 재할당되어 카피됩니다.또, 33번째 문자에서는, 이러한 현상이 재발해, 어레이를 64 문자로 카피할 수 있습니다.이것이 어떻게 많은 재할당 및 복사본으로 변질되는지를 알 수 있습니다.이것은 실제로 사용을 피하고 싶은 것입니다.StringBuilder/Buffer★★★★★★★★★★★★★★★★★★.
이것은 AbstractStringBuilder의 JDK 6 소스 코드입니다.
void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}
는, 「」를 입니다.StringBuilder/Buffer만큼 더 .당장 그 사이즈가 어느 정도인지 알 수 없습니다.String맞힐수수 수있있요요 요요요요 。필요한 것보다 약간 더 많은 메모리를 할당하는 것이 많은 재할당 및 복사본보다 더 좋습니다.
also, 기, 의의 초기화에 .StringBuilder/Buffer a String이는 String + 16글자의 크기만 할당되기 때문에 대부분의 경우 회피하려는 퇴보적인 재할당 및 복사 사이클이 시작됩니다.자바 6
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
만약 당신이 우연히 그 일을 하게 된다면StringBuilder/Buffer생성하지 않고 호출된 생성자를 제어할 수 없는 경우 퇴화된 재작성 및 복사 동작을 피할 수 있는 방법이 있습니다.결과를 확인하고 싶은 크기로 콜을 실시합니다.String을 사용하다
대안:
덧붙여서, 만약 당신이 정말 열심히 하고 있다면 String구축과 조작에는 로프라고 불리는 성능 지향적인 대안이 있습니다.
하나의은 RSA를 입니다.StringList에 의한 ArrayList<String>하여 모든 .append()..toString()StringBuilder 해,도 있습니다.StringBuilder를 '캐시'를 '캐시'합니다..toString()뭔가 바뀌었을 때만 다시 생성하면 돼요
리리 about about도 잊지 .String.format()컴파일러에 의해 최적화될 수 있는 고정 형식의 출력을 빌드할 때 사용합니다.
그러니까, 연결을 위해서요?
실제의 예:다른 많은 문자열 중에서 새 문자열을 생성하려고 합니다.
예를 들어 메시지를 보내는 경우:
스트링
String s = "Dear " + user.name + "<br>" +
" I saw your profile and got interested in you.<br>" +
" I'm " + user.age + "yrs. old too"
String Builder
String s = new StringBuilder().append.("Dear ").append( user.name ).append( "<br>" )
.append(" I saw your profile and got interested in you.<br>")
.append(" I'm " ).append( user.age ).append( "yrs. old too")
.toString()
또는
String s = new StringBuilder(100).appe..... etc. ...
// The difference is a size of 100 will be allocated upfront as fuzzy lollipop points out.
StringBuffer(구문은 StringBuilder와 동일하지만 효과는 다릅니다)
대해서
StringBuffer ★★StringBuilder
전자는 동기화되고 나중에는 그렇지 않다.
하나의번의 90%에해당) 하면 90%가 호출됩니다.StringBuilder스레드 잠금을 소유하고 있는지 확인하기 위해 멈추지 않기 때문에 훨씬 더 빠르게 실행됩니다.
때문에 이렇게 사용하는 .StringBuilder 할 수 있는 )
String연결(+ 연산자 사용)은 컴파일러에 의해 최적화되어 사용할 수 있습니다.StringBuilder그 때문에, Java의 구시대에는, 모든 사람이 이것을 피해야 한다고 말하고 있었습니다.왜냐하면 연결 때마다 새로운 String 오브젝트가 생성되었기 때문입니다.은 이렇게 하는 것이 .StringBuilder오래된 컴파일러를 사용할 경우를 대비해서.
편집하다
컴파일러가 이 클래스에서 수행하는 작업은 다음과 같습니다.
class StringConcatenation {
int x;
String literal = "Value is" + x;
String builder = new StringBuilder().append("Value is").append(x).toString();
}
javap -c StringConcatenation
Compiled from "StringConcatenation.java"
class StringConcatenation extends java.lang.Object{
int x;
java.lang.String literal;
java.lang.String builder;
StringConcatenation();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #2; //class java/lang/StringBuilder
8: dup
9: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
12: ldc #4; //String Value is
14: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_0
18: getfield #6; //Field x:I
21: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: putfield #9; //Field literal:Ljava/lang/String;
30: aload_0
31: new #2; //class java/lang/StringBuilder
34: dup
35: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
38: ldc #4; //String Value is
40: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
43: aload_0
44: getfield #6; //Field x:I
47: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
50: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
53: putfield #10; //Field builder:Ljava/lang/String;
56: return
}
5 ~ 27번 행은 "Literal"이라는 이름의 문자열에 해당합니다.
31-53의 번호가 붙은 행은 "빌더"라는 이름의 문자열용입니다.
차이가 없습니다. 두 문자열에 대해 정확히 동일한 코드가 실행됩니다.
----------------------------------------------------------------------------------StringBuffer StringBuilder----------------------------------------------------------------------------------스토리지 영역 | 고정 문자열 풀 힙변경 가능 | 없음(불변) 예(변환 가능) 예(변환 가능)스레드 세이프 | 예스 아니요퍼포먼스 | 매우 느린 속도----------------------------------------------------------------------------------
스트링
는 문자열을 나타냅니다.Java 프로그램의 모든 문자열 리터럴(예:"abc"는 이 클래스의 인스턴스로 구현됩니다.
문자열 개체는 일단 생성되면 변경할 수 없습니다.(문자열은 상수)
생성자 또는 메서드를 사용하여 String을 작성하면 이러한 문자열은 힙 메모리에도 저장됩니다.단, 풀에 저장하기 전에 equals 메서드를 사용하여 풀에서 동일한 콘텐츠의 오브젝트 가용성을 체크하는 메서드를 호출합니다.풀에서 String-copy를 사용할 수 있는 경우 참조를 반환합니다. 그렇지 않으면 String 개체가 풀에 추가되고 참조가 반환됩니다.
- (Java 언 the ( ( ((((((((((((((((((((((((((((( ( ( ( ( ( ()가 특별히 지원됩니다.
+이치노String Builder(String Buffer)는 String Builder(String Buffer)를 사용합니다.
String heapSCP = new String("Yash"); heapSCP.concat("."); heapSCP = heapSCP + "M"; heapSCP = heapSCP + 777; // For Example: String Source Code public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }- (Java 언 the ( ( ((((((((((((((((((((((((((((( ( ( ( ( ( ()가 특별히 지원됩니다.
은 string문음음음음음음음음음음음음음음 string string string 에 저장되어 있습니다.
StringConstantPool.String onlyPool = "Yash";
String Builder 및 String Buffer는 가변 문자 시퀀스입니다.즉, 이러한 오브젝트의 값을 변경할 수 있습니다.StringBuffer의 메서드는 StringBuilder와 동일하지만 StringBuffer의 각 메서드는 동기화되므로 스레드 세이프가 됩니다.
StringBuffer 및 StringBuilder 데이터는 새 연산자를 사용해야만 생성할 수 있습니다.따라서 힙 메모리에 저장됩니다.
StringBuilder 인스턴스는 여러 스레드에서 사용할 수 없습니다.이러한 동기화가 필요한 경우 StringBuffer를 사용할 것을 권장합니다.
StringBuffer threadSafe = new StringBuffer("Yash"); threadSafe.append(".M"); threadSafe.toString(); StringBuilder nonSync = new StringBuilder("Yash"); nonSync.append(".M"); nonSync.toString();및에는 StringBuffer "StringBuilder"와 같은 .
replace(int start, int end, String str)★★★★★★★★★★★★★★★★★」reverse().메모: StringBuffer 및 SringBuilder는 다음 기능을 구현하기 위해 가변 가능합니다.
Appendable Interface.
어떤 것을 언제 사용할지.
는 [사용하는 방법]을하는 것이 좋습니다.
String Class. Generics 의 일부로서 값을 정렬 또는 비교하고 싶은 경우는, 다음의 순서로 진행됩니다.String Class.//ClassCastException: java.lang.StringBuffer cannot be cast to java.lang.Comparable Set<StringBuffer> set = new TreeSet<StringBuffer>(); set.add( threadSafe ); System.out.println("Set : "+ set);StringBuffer보다 빠른 StringBuilder로 이동할 때마다 값을 변경하는 경우.여러 스레드가 값을 변경할 경우 StringBuffer로 이동합니다.
ㅇㅇㅇㅇ.StringBuffer입니다.StringBuilder렇지않않 않않않다다
스레드가하고 있는 에서는, >>>>>>>>>>>>>><</FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:>>StringBuilder이치노
5를 사용해야 .StringBuilderStringBufferAPI 뉴 :
이스레드에서 인 " 5"로 되었습니다.
StringBuilder. 。StringBuilder클래스는 같은 조작을 모두 지원하지만 동기화가 실행되지 않기 때문에 더 빠르기 때문에 일반적으로 이 클래스보다 우선적으로 사용해야 합니다.
하는 경우는 거의 이 는 여러 스레드에서 동시에 사용하는 경우가 거의 .StringBuffer거의 항상 불필요한 오버헤드가 됩니다.
개인적으로, 나는 에 대한 실제적인 용도는 없다고 생각한다.StringBuffer문자 시퀀스를 조작하여 여러 스레드 간에 통신하고 싶은 경우는 언제입니까?이 되지 것 , 는 아직 것 같습니다 : ) that전만만만만만만만만만만만만만만 that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that that 。
String과 다른 두 클래스의 차이점은 String은 불변이고 다른 두 클래스는 가변 클래스라는 것입니다.
그런데 왜 우리는 같은 목적을 위해 두 개의 수업을 듣나요?
는 ★★★★★★★★★★★★★★★.StringBuffer하며, 레레 is is is is is is is is is is is?StringBuilder렇지않않 않않않다다 StringBuilder 수업입니다.StringBuffer Api 에에었었 and and and 에 소개되어 있습니다.JDK5, 스레드 하고 있는 는, 반드시 합니다. 경우입니다.Faster
상세한 것에 대하여는, http://www.codingeek.com/java/stringbuilder-and-stringbuffer-a-way-to-create-mutable-strings-in-java/ 를 참조해 주세요.
Java에서 String은 불변입니다.불변이라는 것은 일단 String이 생성되면 그 값을 변경할 수 없다는 것을 의미합니다.String Buffer는 가변입니다.StringBuffer 객체가 생성되면 새 객체를 만드는 대신 객체의 값에 콘텐츠를 추가합니다.String Builder는 String Buffer와 비슷하지만 스레드 세이프가 아닙니다.Sting Builder 메서드는 동기화되지 않지만 String Builder가 다른 String에 비해 가장 빠르게 실행됩니다.String, StringBuilder 및 StringBuffer를 구현하면 이러한 차이를 알 수 있습니다.
언급URL : https://stackoverflow.com/questions/2971315/string-stringbuffer-and-stringbuilder
'source' 카테고리의 다른 글
| Brew 목록 서비스를 실행할 때 Brew-error 256(mariadb의 경우)의 원인을 찾습니다. (0) | 2023.01.15 |
|---|---|
| MySQL 시스템 테이블을 최신 버전에서 InnoDB로 변환할 수 있습니까? (0) | 2023.01.15 |
| 구분 기호는 영숫자 또는 백슬래시 및 preg_match일 수 없습니다. (0) | 2023.01.15 |
| 이 연결은 현재 {tls_version}을(를) 사용하고 있으며 Linux에서 Flask 애플리케이션을 배포할 수 없습니다. (0) | 2023.01.15 |
| 사용자 이름을 검증하는 정규 표현 (0) | 2023.01.15 |
