æä¼é çJavaå符串Stringæ¼æ¥æ¯åªç§æ¹å¼ï¼
âå¥ï¼ä½ 让æççãJava å¼åæåã䏿è¿ä¹ä¸æ®µå
容ï¼å¾ªç¯ä½å
ï¼æ¼æ¥å符串æå¥½ä½¿ç¨ StringBuilder ç append() æ¹æ³ï¼è䏿¯ + å·æä½ç¬¦ãè¿æ¯ä¸ºä»ä¹åï¼âä¸å¦¹çæå°é®ã
âå ¶å®è¿ä¸ªé®é¢ï¼æä»¬ä¹åå¨ StringBuilder æ¶å·²ç»èè¿äºãâææ ¢ååå°åçéï¼âä¸è¿ï¼ä¸å¦¹ï¼å¥ä»å¤©æ¥ç»ä½ æ·±å ¥å°è®²è®²ãâ
PSï¼ä¸å¦¹è½å¨å¦ä¹ çè¿ç¨ä¸ä¸æå°åç°é®é¢ï¼è®©ææå°é常çå¼å¿ãå ¶å®å¾å¤æ¶åï¼æä»¬ä¸åºè¯¥åªæ¯æç¥è¯ç¹è®°å¨å¿éï¼è¿åºè¯¥é®ä¸é®èªå·±ï¼å°åºæ¯ä¸ºä»ä¹ï¼åªæè¿åºå»è¿ä¸æ¥ï¼æè½çæ£çæé¿èµ·æ¥ã
+å·æä½ç¬¦çæ¬è´¨
â+ å·æä½ç¬¦å ¶å®è¢« Java å¨ç¼è¯çæ¶åéæ°è§£éäºï¼æ¢ä¸ç§è¯´æ³å°±æ¯ï¼+ å·æä½ç¬¦æ¯ä¸ç§è¯æ³ç³ï¼è®©åç¬¦ä¸²çæ¼æ¥å徿´ç®ä¾¿äºãâä¸è¾¹ç»ä¸å¦¹è§£éï¼æä¸è¾¹å¨ Intellij IDEA 䏿²åºäºä¸é¢è¿æ®µä»£ç ã
class Demo {
public static void main(String[] args) {
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println(chenmo + wanger);
}
}å¨ Java 8 çç¯å¢ä¸ï¼ä½¿ç¨ javap -c Demo.class åç¼è¯åèç åï¼åèç å javap æä»¬ä¼å¨ JVM ä¸è¯¦ç»è®²ï¼è¿éå¯ä»¥ç¡¬ç头ç®çä¸ç¼ï¼ï¼å¯ä»¥çå°ä»¥ä¸å
容ï¼
Compiled from "Demo.java"
class Demo {
Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String æ²é»
2: astore_1
3: ldc #3 // String çäº
5: astore_2
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: new #5 // class java/lang/StringBuilder
12: dup
13: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
16: aload_1
17: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: aload_2
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
}ï¼å¦æä½ ä¹å没æäºè§£è¿åèç æä»¤ï¼å¯è½ä¼æä¸ç¹ååï¼ä¸è¿ï¼ä¸ç¨æ å¿ï¼æä»¬ç¨å¾®è§£éä¸ä¸å°±æäºï¼
âä½ çï¼ä¸å¦¹ï¼è¿éæä¸ä¸ª new å
³é®åï¼å¹¶ä¸ class ç±»å为 java/lang/StringBuilderãâææçæ å·ä¸º 9 çé£è¡å¯¹ä¸å¦¹è¯´ï¼âè¿æå³çæ°å»ºäºä¸ä¸ª StringBuilder ç对象ãâ
âç¶åçæ å·ä¸º 17 çè¿è¡ï¼æ¯ä¸ä¸ª invokevirtual æä»¤ï¼ç¨äºè°ç¨å¯¹è±¡çæ¹æ³ï¼ä¹å°±æ¯ StringBuilder 对象ç append() æ¹æ³ãâ
âä¹å°±æå³çæ chenmoï¼"æ²é»"ï¼è¿ä¸ªå符串添å å° StringBuilder 对象ä¸äºãâ
âåå¾ä¸çï¼æ å·ä¸º 21 çè¿è¡ï¼åè°ç¨äºä¸æ¬¡ append() æ¹æ³ï¼æå³çæ wangerï¼"çäº"ï¼è¿ä¸ªå符串添å å° StringBuilder 对象ä¸äºãâ
æ¢æ Java ä»£ç æ¥è¡¨ç¤ºçè¯ï¼å¤§æ¦æ¯è¿ä¸ªæ ·åï¼
class Demo {
public static void main(String[] args) {
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println((new StringBuilder(chenmo)).append(wanger).toString());
}
}âå¦ï¼åæ¥ç¼è¯çæ¶åæâ+âå·æä½ç¬¦æ¿æ¢æäº StringBuilder ç append() æ¹æ³åãâä¸å¦¹æç¶å¤§æã
âæ¯çï¼ä¸è¿å°äº Java 9ï¼ä¸æ¯é¿ææ¯æçæ¬ï¼æä»¥æä¼æ¿ Java 11 æ¥æ¼ç¤ºï¼ï¼æ åµåçäºä¸äºæ¹åï¼åæ ·ç代ç ï¼åèç æä»¤å®å ¨ä¸åäºãâæè¯´ã
åæ ·ç代ç ï¼å¨ Java 11 çç¯å¢ä¸ï¼åèç æä»¤æ¯è¿æ ·çï¼
Compiled from "Demo.java"
public class com.itwanger.thirtyseven.Demo {
public com.itwanger.thirtyseven.Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: bipush 10
8: if_icmpge 41
11: new #3 // class java/lang/String
14: dup
15: ldc #4 // String æ²é»
17: invokespecial #5 // Method java/lang/String."<init>":(Ljava/lang/String;)V
20: astore_3
21: ldc #6 // String çäº
23: astore 4
25: aload_1
26: aload_3
27: aload 4
29: invokedynamic #7, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
34: astore_1
35: iinc 2, 1
38: goto 5
41: return
}çæ å·ä¸º 29 çè¿è¡ï¼åèç æä»¤ä¸º invokedynamicï¼è¯¥æä»¤å
许ç±åºç¨çº§çä»£ç æ¥å³å®æ¹æ³è§£æï¼æè°çåºç¨çº§ç代ç å
¶å®æ¯ä¸ä¸ªæ¹æ³ââ被称为å¼å¯¼æ¹æ³ï¼Bootstrap Methodï¼ï¼ç®ç§° BSMï¼BSM ä¼è¿åä¸ä¸ª CallSiteï¼è°ç¨ç¹ï¼ 对象ï¼è¿ä¸ªå¯¹è±¡å°±å invokedynamic æä»¤é¾æ¥å¨ä¸èµ·ã以ååæ§è¡è¿æ¡ invokedynamic æä»¤æ¶å°±ä¸ä¼å建æ°ç CallSite 对象ãCallSite å
¶å®å°±æ¯ä¸ä¸ª MethodHandleï¼æ¹æ³å¥æï¼ç holderï¼æåä¸ä¸ªè°ç¨ç¹çæ£æ§è¡çæ¹æ³ââæ¤æ¶å°±æ¯ StringConcatFactory.makeConcatWithConstants() æ¹æ³ã
âå¥ï¼ä½ å«å说äºï¼å说æå°±å¬ä¸æäºãâä¸å¦¹ææäºæçè¯ã
â好å§ï¼æ»ä¹å°±æ¯ Java 9 以åï¼JDK ç¨äºå¦å¤ä¸ç§æ¹æ³æ¥å¨æè§£é + å·æä½ç¬¦ï¼å ·ä½çå®ç°æ¹å¼å¨åèç æä»¤å±é¢å·²ç»çä¸å°äºï¼æä»¥æå°±ä»¥ Java 8 æ¥ç»§ç»è®²è§£å§ãâ
è¿éæä»¬åå¤è®²ä¸ç¹ï¼å¦ææ¯ä¸é¢è¿æ®µä»£ç ï¼
class StringConcat {
public static void main(String[] args) {
int i = 11;
String s = i + "";
System.out.println(s);
}
}+ å·æä½ç¬¦åæ¯å¦ä½å®ææ¼æ¥å¢ï¼
åæ ·å¯ä»¥æ¥éè¿ javap -c StringConcatçä¸ä¸åèç æä»¤ï¼

ä»ä¸å¾ä¸å¯ä»¥çå°ï¼+ å·æä½ç¬¦è¢«ç¼è¯æäº StringBuilder ç append() æ¹æ³ã
é£å¦ææ¯è¿æ ·ç代ç ï¼
class StringConcat1 {
public static void main(String[] args) {
String s = 11 + "";
System.out.println(s);
}
}+ å·æä½ç¬¦åæ¯å¦ä½å®ææ¼æ¥å¢ï¼
åæ ·å¯ä»¥æ¥éè¿ javap -c StringConcat1çä¸ä¸åèç æä»¤ï¼

StringBuilder ä¸è§äºï¼è¿æ¯ä¸ºä»ä¹å¢ï¼
è¿æ¯å 为 + è¿æ¥æä½ç两个æä½æ°é½æ¯ç¼è¯æ¶å¸¸éï¼ä¸ä¸ªæ¯åé¢éæ´æ° 11ï¼å¦ä¸ä¸ªæ¯ç©ºå符串 ""ï¼ï¼æä»¥ç¼è¯å¨è½å¤å¨ç¼è¯æ¶å°±å®æè¿ä¸ªåç¬¦ä¸²è¿æ¥æä½ã
ä¹å°±æ¯è¯´ï¼åç¬¦ä¸²è¿æ¥ 11 + "" 被ç¼è¯å¨ä¼åå¤çäºï¼ç¼è¯å¨å¨ç¼è¯é¶æ®µå°±å°å ¶è§£æä¸ºäºå符串常é "11"ã
为ä»ä¹è¦ç¼è¯ä¸º StringBuilder.append
âååå°ãJava å¼åæåãä¸ç飿®µå 容ï¼
循ç¯ä½å
ï¼æ¼æ¥å符串æå¥½ä½¿ç¨ StringBuilder ç append() æ¹æ³ï¼è䏿¯ + å·æä½ç¬¦ãåå å°±å¨äºå¾ªç¯ä½å
å¦æç¨ + å·æä½ç¬¦çè¯ï¼å°±ä¼äº§ç大éç StringBuilder 对象ï¼ä¸ä»
å ç¨äºæ´å¤çå
å空é´ï¼è¿ä¼è®© Java èææºä¸åçè¿è¡åå¾åæ¶ï¼ä»èéä½äºç¨åºçæ§è½ãâ
æ´å¥½ç忳就æ¯å¨å¾ªç¯çå¤é¨æ°å»ºä¸ä¸ª StringBuilder 对象ï¼ç¶åä½¿ç¨ append() æ¹æ³å°å¾ªç¯ä½å
çå符串添å è¿æ¥ï¼
class Demo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 10; i++) {
String chenmo = "æ²é»";
String wanger = "çäº";
sb.append(chenmo);
sb.append(wanger);
}
System.out.println(sb);
}
}æ¥åä¸ªå°æµè¯ã
第ä¸ä¸ªï¼for 循ç¯ä¸ä½¿ç¨â+âå·æä½ç¬¦ã
String result = "";
for (int i = 0; i < 100000; i++) {
result += "å
å
å
";
}第äºä¸ªï¼for 循ç¯å¤é¨æ°å»º StringBuilderï¼å¾ªç¯ä½å
ä½¿ç¨ append() æ¹æ³ã
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("å
å
å
");
}âè¿ä¸¤ä¸ªå°æµè¯åå«ä¼èæ¶å¤é¿æ¶é´å¢ï¼ä¸å¦¹ä½ æ¥è¿è¡ä¸ãâ
âåï¼ç¬¬ä¸ä¸ªå°æµè¯çæ§è¡æ¶é´æ¯ 6212 毫ç§ï¼ç¬¬äºä¸ªåªç¨äºä¸å° 1 毫ç§ï¼å·®è·ä¹å¤ªå¤§äºå§ï¼âä¸å¦¹è¯´ã
âæ¯çï¼è¿ä¸æç½äºåå å§ï¼âæè¯´ã
âæ¯çï¼å¥ï¼åæ¥å¦æ¤ãâ
appendæ¹æ³æºç è§£æ
â好äºï¼ä¸å¦¹ï¼æ¥çä¸ä¸ StringBuilder ç±»ç append() æ¹æ³çæºç å§ï¼â
public StringBuilder append(String str) {
super.append(str);
return this;
}è¿ 3 è¡ä»£ç å
¶å®æ²¡å¥ççãæä»¬æ¥çç¶ç±» AbstractStringBuilder ç append() æ¹æ³ï¼
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;
}1ï¼å¤ææ¼æ¥çå符串æ¯ä¸æ¯ nullï¼å¦ææ¯ï¼å½åå符串ânullâæ¥å¤çãappendNull() æ¹æ³çæºç å¦ä¸ï¼
private AbstractStringBuilder appendNull() {
int c = count;
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}2ï¼è·åå符串çé¿åº¦ã
3ï¼ensureCapacityInternal() æ¹æ³çæºç å¦ä¸ï¼
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}ç±äºå符串å 鍿¯ç¨æ°ç»å®ç°çï¼æä»¥éè¦å å¤ææ¼æ¥åçå符æ°ç»é¿åº¦æ¯å¦è¶ è¿å½åæ°ç»çé¿åº¦ï¼å¦æè¶ è¿ï¼å 对æ°ç»è¿è¡æ©å®¹ï¼ç¶åæåæçå¼å¤å¶å°æ°çæ°ç»ä¸ã
4ï¼å°æ¼æ¥çå符串 str å¤å¶å°ç®æ æ°ç» value ä¸ã
str.getChars(0, len, value, count)5ï¼æ´æ°æ°ç»çé¿åº¦ countã
String.concat æ¼æ¥å符串
âé¤äºå¯ä»¥ä½¿ç¨ + å·æä½ç¬¦ï¼StringBuilder ç append() æ¹æ³ï¼è¿æå
¶ä»çåç¬¦ä¸²æ¼æ¥æ¹æ³åï¼âä¸å¦¹é®ã
âæåï¼æ¯å¦è¯´ String ç±»ç concat() æ¹æ³ï¼æç¹å StringBuilder ç±»ç append() æ¹æ³ãâ
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println(chenmo.concat(wanger));å¯ä»¥æ¥çä¸ä¸ concat() æ¹æ³çæºç ã
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);
}1ï¼å¦ææ¼æ¥çå符串çé¿åº¦ä¸º 0ï¼é£ä¹è¿åæ¼æ¥åçå符串ã
2ï¼å°åå符串çå符æ°ç» value å¤å¶å°åé buf æ°ç»ä¸ã
3ï¼ææ¼æ¥çå符串 str å¤å¶å°å符æ°ç» buf ä¸ï¼å¹¶è¿åæ°çå符串对象ã
æä¸è¡ä¸è¡å°ç»ä¸å¦¹è§£éçã
âå + å·æä½ç¬¦ç¸æ¯ï¼concat() æ¹æ³å¨éå°å符串为 null çæ¶åï¼ä¼æåº NullPointerExceptionï¼èâ+âå·æä½ç¬¦ä¼æ null å½åæ¯ânullâå符串æ¥å¤çãâ
å¦ææ¼æ¥çå符串æ¯ä¸ä¸ªç©ºå符串ï¼""ï¼ï¼é£ä¹ concat çæçè¦æ´é«ä¸ç¹,æ¯ç«ä¸éè¦ new StringBuilder 对象ã
å¦ææ¼æ¥çå符串é常å¤ï¼concat() çæçå°±ä¼ä¸éï¼å 为å建çåç¬¦ä¸²å¯¹è±¡è¶æ¥è¶å¤ã
âè¿æåï¼âä¸å¦¹ä¼¼ä¹å¯¹åç¬¦ä¸²æ¼æ¥å¾æå ´è¶£ã
âæï¼å½ç¶æãâ
String.join æ¼æ¥å符串
String ç±»æä¸ä¸ªéææ¹æ³ join()ï¼å¯ä»¥è¿æ ·æ¥ä½¿ç¨ã
String chenmo = "æ²é»";
String wanger = "çäº";
String cmower = String.join("", chenmo, wanger);
System.out.println(cmower);第ä¸ä¸ªåæ°ä¸ºåç¬¦ä¸²è¿æ¥ç¬¦ï¼æ¯å¦è¯´ï¼
String message = String.join("-", "çäº", "太ç¹ä¹", "æè¶£äº");è¾åºç»æä¸ºï¼çäº-太ç¹ä¹-æè¶£äºã
æ¥çä¸ä¸ join æ¹æ³çæºç ï¼
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}é颿°å»ºäºä¸ä¸ªå« StringJoiner ç对象ï¼ç¶åéè¿ for-each å¾ªç¯æå¯ååæ°æ·»å äºè¿æ¥ï¼æåè°ç¨ toString() æ¹æ³è¿å Stringã
StringUtils.join æ¼æ¥å符串
âå®é
çå·¥ä½ä¸ï¼org.apache.commons.lang3.StringUtils ç join() æ¹æ³ä¹ç»å¸¸ç¨æ¥è¿è¡åç¬¦ä¸²æ¼æ¥ãâ
String chenmo = "æ²é»";
String wanger = "çäº";
StringUtils.join(chenmo, wanger);è¯¥æ¹æ³ä¸ç¨æ å¿ NullPointerExceptionã
StringUtils.join(null) = null
StringUtils.join([]) = ""
StringUtils.join([null]) = ""
StringUtils.join(["a", "b", "c"]) = "abc"
StringUtils.join([null, "", "a"]) = "a"æ¥çä¸ä¸æºç ï¼
public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) {
if (array == null) {
return null;
}
if (separator == null) {
separator = EMPTY;
}
final StringBuilder buf = new StringBuilder(noOfItems * 16);
for (int i = startIndex; i < endIndex; i++) {
if (i > startIndex) {
buf.append(separator);
}
if (array[i] != null) {
buf.append(array[i]);
}
}
return buf.toString();
}å é¨ä½¿ç¨çä»ç¶æ¯ StringBuilderã
â好äºï¼ä¸å¦¹ï¼å ³äºåç¬¦ä¸²æ¼æ¥çç¥è¯ç¹æä»¬å°±è®²å°è¿å§ã注æ Java 9 以åï¼å¯¹ + å·æä½ç¬¦çè§£éåä¹ååçäºååï¼åèç æä»¤å·²ç»ä¸åäºï¼çåé¢ä½ å¦äºåèç æä»¤åæä»¬å详ç»å°è®²ä¸æ¬¡ãâæè¯´ã
âå¯ï¼å¥ï¼ä½ 伿¯å§ï¼ææè¿äºä¾ååéæ°è·ä¸éãâä¸å¦¹è¯´ã
GitHub 䏿 æ 10000+ ç弿ºç¥è¯åºãäºå¥ç Java è¿é¶ä¹è·¯ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼å¤ªèµäºï¼GitHub 䏿 æ 10000+ ç Java æç¨
å¾®ä¿¡æ æ²é»çäº ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ 222 å³å¯å è´¹é¢åã

