èè Java StringBuilderåStringBuffer 两å å¼
âå¥ï¼ä¸ä¸ç¯æ·±å ¥çè§£ String.intern() 讲å°äº StringBuilderï¼è¿ä¸èæä»¬å°±æ¥èèå§ï¼âä¸å¦¹å¾æå¾ ã
â好åï¼å®ä»¬ä¹é´çå ³ç³»è¿ççæ¯æºåè°çãâççä¸å¦¹å¥½å¥çæ ·åï¼ææå°å¦ææ¯å°±åºè¯¥æ¯è¿ä¸ªæ ·åæå¯¹ã
StringBufferåStringBuilderçåºå«
ç±äºå符串æ¯ä¸å¯åçï¼æä»¥å½éå°åç¬¦ä¸²æ¼æ¥ï¼å°¤å
¶æ¯ä½¿ç¨+å·æä½ç¬¦ï¼çæ¶åï¼å°±éè¦èéæ§è½çé®é¢ï¼ä½ ä¸è½æ¯«æ 顾èå°çäº§å¤ªå¤ String 对象ï¼å¯¹çè´µçå
åé æä¸å¿
è¦çååã
äºæ¯ Java 就设计äºä¸ä¸ªä¸é¨ç¨æ¥è§£å³æ¤é®é¢ç StringBuffer ç±»ã
public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence {
public StringBuffer() {
super(16);
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
public synchronized String toString() {
return new String(value, 0, count);
}
// å
¶ä»æ¹æ³
}ä¸è¿ï¼ç±äº StringBuffer æä½åç¬¦ä¸²çæ¹æ³å äº synchronized å
³é®åè¿è¡äºåæ¥ï¼ä¸»è¦æ¯èèå°å¤çº¿ç¨ç¯å¢ä¸çå®å
¨é®é¢ï¼æä»¥å¦æå¨éå¤çº¿ç¨ç¯å¢ä¸ï¼æ§è¡æç就伿¯è¾ä½ï¼å 为å äºæ²¡å¿
è¦çéã
äºæ¯ Java å°±ç» StringBuffer âçäºä¸ªå
å¼âï¼åå« StringBuilderï¼è¯´ï¼âå©åï¼ä½ å«ç®¡çº¿ç¨å®å
¨äºï¼ä½ å°±å¨å线ç¨ç¯å¢ä¸ä½¿ç¨ï¼è¿æ ·æçä¼é«å¾å¤ï¼å¦æè¦å¨å¤çº¿ç¨ç¯å¢ä¸ä¿®æ¹å符串ï¼ä½ å°æ¶åå¯ä»¥ä½¿ç¨ ThreadLocal æ¥é¿å
å¤çº¿ç¨å²çªãâ
public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
// ...
public StringBuilder append(String str) {
super.append(str);
return this;
}
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
// ...
}é¤äºç±»åä¸åï¼æ¹æ³æ²¡æå synchronizedï¼åºæ¬ä¸å®å ¨ä¸æ ·ã
å®é å¼åä¸ï¼StringBuilder ç使ç¨é¢ç乿¯è¿é«äº StringBufferï¼çè³å¯ä»¥è¿ä¹è¯´ï¼StringBuilder å®å ¨åä»£äº StringBufferã
StringBuilderç使ç¨
ä¹åæä»¬ä¹æ¾èè¿ï¼Java æ¯ä¸é¨è§£éåçç¼ç¨è¯è¨ï¼æä»¥å½ç¼è¯å¨éå° + å·è¿ä¸ªæä½ç¬¦çæ¶åï¼ä¼å° new String("äºå¥") + new String("ä¸å¦¹") è¿è¡ä»£ç è§£é为以ä¸ä»£ç ï¼
new StringBuilder().append("äºå¥").append("ä¸å¦¹").toString();è¿ä¸ªè¿ç¨æ¯æä»¬çä¸è§çï¼ä½è¿æ£æ¯ Java çâæºè½âä¹å¤ï¼å®å¯ä»¥å¨ç¼è¯çæ¶åå·å·å°å¸®æä»¬åå¾å¤ä¼åï¼è¿æ ·æ¢å¯ä»¥æé«æä»¬çå¼åæçï¼+ å·åèµ·æ¥æ¯å建 StringBuilder 对象便æ·å¾å¤ï¼ï¼ä¹ä¸ä¼å½±å JVM çæ§è¡æçã
å½ç¶äºï¼å¦ææä»¬ä½¿ç¨ javap åç¼è¯ new String("äºå¥") + new String("ä¸å¦¹") çåèç çæ¶åï¼ä¹æ¯è½çåº StringBuilder çå½±åçã
javap ååèç ä¼å¨åé¢è®² JVM çæ¶å详ç»è®²è§£ï¼æ³é¾æ¥äºè§£è¯¦æ ã
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: new #4 // class java/lang/String
10: dup
11: ldc #5 // String äºå¥
13: invokespecial #6 // Method java/lang/String."<init>":(Ljava/lang/String;)V
16: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: new #4 // class java/lang/String
22: dup
23: ldc #8 // String ä¸å¦¹
25: invokespecial #6 // Method java/lang/String."<init>":(Ljava/lang/String;)V
28: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
31: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
34: areturnå¯ä»¥çå° Java ç¼è¯å¨å°åç¬¦ä¸²æ¼æ¥æä½ï¼+ï¼è½¬æ¢ä¸ºäº StringBuilder 对象ç append æ¹æ³ï¼ç¶ååè°ç¨ StringBuilder 对象ç toString æ¹æ³è¿åæ¼æ¥åçå符串ã
StringBuilderçå é¨å®ç°
æ¥çä¸ä¸ StringBuilder ç toString æ¹æ³ï¼
public String toString() {
return new String(value, 0, count);
}value æ¯ä¸ä¸ª char ç±»åçæ°ç»ï¼
/**
* The value is used for character storage.
*/
char[] value;å¨ StringBuilder 对象å建æ¶ï¼ä¼ä¸º value åé ä¸å®çå å空é´ï¼åå§å®¹é 16ï¼ï¼ç¨äºåå¨å符串ã
/**
* Constructs a string builder with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuilder() {
super(16);
}éçåç¬¦ä¸²çæ¼æ¥ï¼value æ°ç»çé¿åº¦ä¼ä¸æå¢å ï¼å æ¤å¨ StringBuilder 对象çå®ç°ä¸ï¼value æ°ç»çé¿åº¦æ¯å¯ä»¥å¨ææ©å±çï¼å°±åArrayList飿 ·ã
ç»§ç»æ¥ç StringBuilder ç toString æ¹æ³ï¼
public String toString() {
return new String(value, 0, count);
}value ç¨äºåå¨ StringBuilder 对象ä¸å
å«çå符åºåãcount æ¯ä¸ä¸ª int ç±»åçåéï¼è¡¨ç¤ºå符åºåçé¿åº¦ãtoString() æ¹æ³ä¼è°ç¨ new String(value, 0, count)ï¼ä½¿ç¨ value æ°ç»ä¸ä» 0 å¼å§çå count 个å
ç´ å建ä¸ä¸ªæ°çå符串对象ï¼å¹¶å°å
¶è¿åã
忥çä¸ä¸ append æ¹æ³ï¼
public StringBuilder append(String str) {
super.append(str);
return this;
}å®é
䏿¯è°ç¨äº AbstractStringBuilder ä¸ç append(String str) æ¹æ³ãå¨ AbstractStringBuilder ä¸ï¼append(String str) æ¹æ³ä¼æ£æ¥å½åå符åºåä¸çå符æ¯å¦å¤ç¨ï¼å¦æä¸å¤ç¨åä¼è¿è¡æ©å®¹ï¼å¹¶å°æå®å符串追å å°å符åºåçæ«å°¾ã
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}append(String str) æ¹æ³å°æå®å符串追å å°å½åå符åºåä¸ã妿æå®å符串为 nullï¼å追å å符串 "null"ï¼å¦å伿£æ¥æå®å符串çé¿åº¦ï¼ç¶åæ ¹æ®å½åå符åºåä¸çå符æ°åæå®å符串çé¿åº¦æ¥å¤ææ¯å¦éè¦æ©å®¹ã
妿éè¦æ©å®¹ï¼åä¼è°ç¨ ensureCapacityInternal(int minimumCapacity) æ¹æ³ãæ©å®¹ä¹åï¼å°æå®å符串çå符æ·è´å°å符åºåä¸ã
æ¥çä¸ä¸ ensureCapacityInternal æ¹æ³ï¼
private void ensureCapacityInternal(int minimumCapacity) {
// ä¸å¤ç¨äºï¼æ©å®¹
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
// æ©å®¹çç¥ï¼æ°å®¹é为æ§å®¹éç两åå ä¸ 2
int newCapacity = value.length * 2 + 2;
// 妿æ°å®¹éå°äºæå®çæå°å®¹éï¼åæ°å®¹é为æå®çæå°å®¹é
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
// 妿æ°å®¹éå°äº 0ï¼åæ°å®¹é为 Integer.MAX_VALUE
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
// å°å符åºåç容鿩容尿°å®¹éç大å°
value = Arrays.copyOf(value, newCapacity);
}ensureCapacityInternal(int minimumCapacity) æ¹æ³ç¨äºç¡®ä¿å½åå符åºåç容éè³å°çäºæå®çæå°å®¹é minimumCapacityã妿å½å容éå°äºæå®ç容éï¼å°±ä¼ä¸ºå符åºååé
ä¸ä¸ªæ°çå
鍿°ç»ãæ°å®¹éçè®¡ç®æ¹å¼å¦ä¸ï¼
- 妿æå®çæå°å®¹é大äºå½å容éï¼åæ°å®¹é为两åçæ§å®¹éå ä¸ 2ã为ä»ä¹è¦å 2 å¢ï¼å¯¹äºé常å°çåç¬¦ä¸²ï¼æ¯å¦ç©ºçæåªæä¸ä¸ªå符ç StringBuilderï¼ï¼ä» ä» å°å®¹éå åå¯è½ä»ç¶ä¸è¶³ä»¥å®¹çº³æ´å¤çå符ãå¨è¿ç§æ åµä¸ï¼+ 2 æä¾äºä¸ä¸ªæå°çå¢é¿éï¼ç¡®ä¿å³ä½¿å¯¹äºå¾å°çåå§å®¹éï¼æ©å®¹åä¹è½è³å°æ·»å ä¸äºå符èä¸éè¦ç«å³å次æ©å®¹ã
- 妿æå®çæå°å®¹éå°äºçäºå½å容éï¼åä¸ä¼è¿è¡æ©å®¹ï¼ç´æ¥è¿åå½å对象ã
å¨è¿è¡æ©å®¹ä¹åï¼ensureCapacityInternal(int minimumCapacity) æ¹æ³ä¼å
æ£æ¥å½åå符åºåç容鿝å¦è¶³å¤ï¼å¦æä¸è¶³å°±ä¼è°ç¨ expandCapacity(int minimumCapacity) æ¹æ³è¿è¡æ©å®¹ãexpandCapacity(int minimumCapacity) æ¹æ³é¦å
计ç®åºæ°å®¹éï¼ç¶åä½¿ç¨ Arrays.copyOf(char[] original, int newLength) æ¹æ³å°åå符æ°ç»æ©å®¹å°æ°å®¹éç大å°ã
StringBuilderç reverse æ¹æ³
StringBuilder è¿æä¾äºä¸ä¸ª reverse æ¹æ³ï¼ç¨äºå转å½åå符åºåä¸çå符ã
public StringBuilder reverse() {
super.reverse();
return this;
}乿¯è°ç¨äºç¶ç±» AbstractStringBuilder ä¸ç reverse() æ¹æ³ï¼ææä¸äºéæ ¸å¿ä»£ç å餿äºã
public AbstractStringBuilder reverse() {
int n = count - 1; // å符åºåçæåä¸ä¸ªå符çç´¢å¼
// éåå符串çååé¨å
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j; // 计ç®ç¸å¯¹äº j 对称çå符çç´¢å¼
char cj = value[j]; // è·åå½åä½ç½®çå符
char ck = value[k]; // è·å对称ä½ç½®çå符
value[j] = ck; // 交æ¢å符
value[k] = cj; // 交æ¢å符
}
return this; // è¿åå转åçå符串æå»ºå¨å¯¹è±¡
}- åå§åï¼
næ¯åç¬¦ä¸²ä¸æåä¸ä¸ªå符çç´¢å¼ã - å符串å转ï¼
- æ¹æ³éè¿ä¸ä¸ª
for循ç¯éåå符串çååé¨ååååé¨åï¼è¿æ¯ä¸ä¸ªé常巧å¦çç¹ï¼æ¯ä»å¤´å°å°¾éåçäºä¸åçæ¶é´ã(n-1) >> 1æ¯(n-1) / 2çä½è¿ç®è¡¨ç¤ºï¼ä¹å°±æ¯å符串çååé¨åçæåä¸ä¸ªå符çç´¢å¼ã - 卿¯æ¬¡è¿ä»£ä¸ï¼è®¡ç®åºä¸å½åç´¢å¼
j对称çç´¢å¼kï¼å¹¶äº¤æ¢è¿ä¸¤ä¸ªç´¢å¼ä½ç½®çå符ã
- æ¹æ³éè¿ä¸ä¸ª
LeetCode ç第 7 é¢ã007.æ´æ°å转ãè¦æ±æä»¬å转ä¸ä¸ªæ´æ°ï¼å ¶å®å°±å¯ä»¥åå© StringBuilder ç reverse æ¹æ³æ¥å®ç°ã
é¢è§£æ¾å¨äºææ¯æ´¾ä¸ï¼å¯ä»¥åèã
å°ç»
âææ³ï¼å ³äº StringBuilderãStringBuilder ä¹é´çå·®å«ï¼ä½ é½ææ¸ æ¥äºå§ï¼âæé®ã
âææ¸ æ¥çè¯ï¼å¯ä»¥éè¿ LeetCode ç第å é¢ã006.Z å形忢ãè¿è¡æµè¯ï¼ææé¢è§£æ¾å¨äºææ¯æ´¾ä¸ï¼ä½ å¯ä»¥ä½ä¸ºåèãâ
âå¥ï¼ä½ çæ£ï¼åºå«ææ¯ææ¸ æ¥äºï¼ä½ åé¢è®²çæºç æ©å®¹è¿æ²¡æ¶åï¼æä¸ä¼å»å 个é¤ï¼åç»çä¸ä¸ãâä¸å¦¹è¯´ã
âå¯ä»¥çï¼å®é ä¸ï¼ä½ ç°å¨åªéè¦ç¥é StringBuilder çç¨æ³å°±å¯ä»¥äºãâåäºä¸å£å³æè¾¹çå¯å£å¯ä¹ï¼æ ç³ï¼åï¼ææè§å¥½ç½å¿«åã
GitHub 䏿 æ 10000+ ç弿ºç¥è¯åºãäºå¥ç Java è¿é¶ä¹è·¯ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼å¤ªèµäºï¼GitHub 䏿 æ 10000+ ç Java æç¨
å¾®ä¿¡æ æ²é»çäº ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ 222 å³å¯å è´¹é¢åã

