---
title: æä¼é
çJavaåç¬¦ä¸²æ¼æ¥æ¯åªç§æ¹å¼ï¼
shortTitle: Javaåç¬¦ä¸²æ¼æ¥
category:
- Javaæ ¸å¿
tag:
- æ°ç»&å符串
description: Javaç¨åºåè¿é¶ä¹è·¯ï¼å°ç½çé¶åºç¡Javaæç¨ï¼ä»å
¥é¨å°è¿é¶ï¼æä¼é
çJavaåç¬¦ä¸²æ¼æ¥æ¯åªç§æ¹å¼ï¼
head:
- - meta
- name: keywords
content: Java,Java SE,Java åºç¡,Java æç¨,Java ç¨åºåè¿é¶ä¹è·¯,Java å
¥é¨,javaå符串,String
- name: description
content: Javaç¨åºåè¿é¶ä¹è·¯ï¼å°ç½çé¶åºç¡Javaæç¨ï¼ä»å
¥é¨å°è¿é¶ï¼æä¼é
çJavaåç¬¦ä¸²æ¼æ¥æ¯åªç§æ¹å¼ï¼
---
âå¥ï¼ä½ 让æççã[Java å¼åæå](https://tobebetterjavaer.com/nice-article/weixin/sulwgalcpdssbjavakfsc.html)ã䏿è¿ä¹ä¸æ®µå
容ï¼å¾ªç¯ä½å
ï¼æ¼æ¥å符串æå¥½ä½¿ç¨ StringBuilder ç `append()` æ¹æ³ï¼è䏿¯ + å·æä½ç¬¦ãè¿æ¯ä¸ºä»ä¹åï¼âä¸å¦¹çæå°é®ã
â好çï¼ä¸å¦¹ï¼å¥æ¥æ
¢æ
¢ç»ä½ 讲ãâæåçã
ä¸å¦¹è½å¨å¦ä¹ çè¿ç¨ä¸ä¸æå°åç°é®é¢ï¼è®©ææå°é常çå¼å¿ãå
¶å®å¾å¤æ¶åï¼æä»¬ä¸åºè¯¥åªæ¯æç¥è¯ç¹è®°å¨å¿éï¼è¿åºè¯¥é®ä¸é®èªå·±ï¼å°åºæ¯ä¸ºä»ä¹ï¼åªæè¿åºå»è¿ä¸æ¥ï¼æè½çæ£çæé¿èµ·æ¥ã
â+ å·æä½ç¬¦å
¶å®è¢« Java å¨ç¼è¯çæ¶åéæ°è§£éäºï¼æ¢ä¸ç§è¯´æ³å°±æ¯ï¼+ å·æä½ç¬¦æ¯ä¸ç§è¯æ³ç³ï¼è®©åç¬¦ä¸²çæ¼æ¥å徿´ç®ä¾¿äºãâä¸è¾¹ç»ä¸å¦¹è§£éï¼æä¸è¾¹å¨ Intellij IDEA 䏿²åºäºä¸é¢è¿æ®µä»£ç ã
```java
class Demo {
public static void main(String[] args) {
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println(chenmo + wanger);
}
}
```
å¨ Java 8 çç¯å¢ä¸ï¼ä½¿ç¨ `javap -c Demo.class` åç¼è¯åèç åï¼å¯ä»¥çå°ä»¥ä¸å
容ï¼
```
Compiled from "Demo.java"
class Demo {
Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()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."":()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 ä»£ç æ¥è¡¨ç¤ºçè¯ï¼å¤§æ¦æ¯è¿ä¸ªæ ·åï¼
```java
class Demo {
public static void main(String[] args) {
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println((new StringBuilder(String.valueOf(chenmo))).append(wanger).toString());
}
}
```
âå¦ï¼åæ¥ç¼è¯çæ¶åæâ+âå·æä½ç¬¦æ¿æ¢æäº StringBuilder ç `append()` æ¹æ³åãâä¸å¦¹æç¶å¤§æã
âæ¯çï¼ä¸è¿å°äº Java 9ï¼æ
åµåçäºä¸äºæ¹åï¼åæ ·ç代ç ï¼åèç æä»¤å®å
¨ä¸åäºãâæè¯´ã
åæ ·ç代ç ï¼å¨ 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."":()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."":(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 æ¥ç»§ç»è®²è§£å§ãâ
âååå°ãJava å¼åæåãä¸ç飿®µå
容ï¼å¾ªç¯ä½å
ï¼æ¼æ¥å符串æå¥½ä½¿ç¨ StringBuilder ç `append()` æ¹æ³ï¼è䏿¯ + å·æä½ç¬¦ãåå å°±å¨äºå¾ªç¯ä½å
å¦æç¨ + å·æä½ç¬¦çè¯ï¼å°±ä¼äº§ç大éç StringBuilder 对象ï¼ä¸ä»
å ç¨äºæ´å¤çå
å空é´ï¼è¿ä¼è®© Java èææºä¸åçè¿è¡åå¾åæ¶ï¼ä»èéä½äºç¨åºçæ§è½ãâ
æ´å¥½ç忳就æ¯å¨å¾ªç¯çå¤é¨æ°å»ºä¸ä¸ª StringBuilder 对象ï¼ç¶åä½¿ç¨ `append()` æ¹æ³å°å¾ªç¯ä½å
çå符串添å è¿æ¥ï¼
```java
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 循ç¯ä¸ä½¿ç¨â+âå·æä½ç¬¦ã
```java
String result = "";
for (int i = 0; i < 100000; i++) {
result += "å
å
å
";
}
```
第äºä¸ªï¼for 循ç¯å¤é¨æ°å»º StringBuilderï¼å¾ªç¯ä½å
ä½¿ç¨ `append()` æ¹æ³ã
```java
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("å
å
å
");
}
```
âè¿ä¸¤ä¸ªå°æµè¯åå«ä¼èæ¶å¤é¿æ¶é´å¢ï¼ä¸å¦¹ä½ æ¥è¿è¡ä¸ãâ
âåï¼ç¬¬ä¸ä¸ªå°æµè¯çæ§è¡æ¶é´æ¯ 6212 毫ç§ï¼ç¬¬äºä¸ªåªç¨äºä¸å° 1 毫ç§ï¼å·®è·ä¹å¤ªå¤§äºå§ï¼âä¸å¦¹è¯´ã
âæ¯çï¼è¿ä¸æç½äºåå å§ï¼âæè¯´ã
âæ¯çï¼å¥ï¼åæ¥å¦æ¤ãâ
â好äºï¼ä¸å¦¹ï¼æ¥çä¸ä¸ StringBuilder ç±»ç `append()` æ¹æ³çæºç å§ï¼â
```java
public StringBuilder append(String str) {
super.append(str);
return this;
}
```
è¿ 3 è¡ä»£ç å
¶å®æ²¡å¥ççãæä»¬æ¥çç¶ç±» AbstractStringBuilder ç `append()` æ¹æ³ï¼
```java
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()` æ¹æ³çæºç å¦ä¸ï¼
```java
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()` æ¹æ³çæºç å¦ä¸ï¼
```java
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
```
ç±äºå符串å
鍿¯ç¨æ°ç»å®ç°çï¼æä»¥éè¦å
å¤ææ¼æ¥åçå符æ°ç»é¿åº¦æ¯å¦è¶
è¿å½åæ°ç»çé¿åº¦ï¼å¦æè¶
è¿ï¼å
对æ°ç»è¿è¡æ©å®¹ï¼ç¶åæåæçå¼å¤å¶å°æ°çæ°ç»ä¸ã
4ï¼å°æ¼æ¥çå符串 str å¤å¶å°ç®æ æ°ç» value ä¸ã
```java
str.getChars(0, len, value, count)
```
5ï¼æ´æ°æ°ç»çé¿åº¦ countã
âè¯´å° StringBuilder å°±å¿
须徿ä¸å´ StringBufferï¼ä¸¤è
就忝åªçåèèï¼è¯¥æç齿ï¼åªä¸è¿å¤§å¥ StringBuffer å 为å¤å¼å¸ä¸¤å£æ°é²ç©ºæ°ï¼æä»¥æ¯çº¿ç¨å®å
¨çãâæè¯´ï¼âå®éé¢çæ¹æ³åºæ¬ä¸é½å äº synchronized å
³é®åæ¥å忥ãâ
```java
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
```
âé¤äºå¯ä»¥ä½¿ç¨ + å·æä½ç¬¦ï¼StringBuilder å StringBuilder ç `append()` æ¹æ³ï¼è¿æå
¶ä»çåç¬¦ä¸²æ¼æ¥æ¹æ³åï¼âä¸å¦¹é®ã
âæåï¼æ¯å¦è¯´ String ç±»ç `concat()` æ¹æ³ï¼æç¹å StringBuilder ç±»ç `append()` æ¹æ³ãâ
```java
String chenmo = "æ²é»";
String wanger = "çäº";
System.out.println(chenmo.concat(wanger));
```
å¯ä»¥æ¥çä¸ä¸ `concat()` æ¹æ³çæºç ã
```java
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()`ï¼å¯ä»¥è¿æ ·æ¥ä½¿ç¨ã
```java
String chenmo = "æ²é»";
String wanger = "çäº";
String cmower = String.join("", chenmo, wanger);
System.out.println(cmower);
```
第ä¸ä¸ªåæ°ä¸ºåç¬¦ä¸²è¿æ¥ç¬¦ï¼æ¯å¦è¯´ï¼
```java
String message = String.join("-", "çäº", "太ç¹ä¹", "æè¶£äº");
```
è¾åºç»æä¸ºï¼`çäº-太ç¹ä¹-æè¶£äº`ã
æ¥çä¸ä¸ join æ¹æ³çæºç ï¼
```java
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ã
âå®é
çå·¥ä½ä¸ï¼`org.apache.commons.lang3.StringUtils` ç `join()` æ¹æ³ä¹ç»å¸¸ç¨æ¥è¿è¡åç¬¦ä¸²æ¼æ¥ãâ
```java
String chenmo = "æ²é»";
String wanger = "çäº";
StringUtils.join(chenmo, wanger);
```
è¯¥æ¹æ³ä¸ç¨æ
å¿ NullPointerExceptionã
```java
StringUtils.join(null) = null
StringUtils.join([]) = ""
StringUtils.join([null]) = ""
StringUtils.join(["a", "b", "c"]) = "abc"
StringUtils.join([null, "", "a"]) = "a"
```
æ¥çä¸ä¸æºç ï¼
```java
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 以åï¼å¯¹ + å·æä½ç¬¦çè§£éåä¹ååçäºååï¼åèç æä»¤å·²ç»ä¸åäºï¼çåé¢ä½ å¦äºåèç æä»¤åæä»¬å详ç»å°è®²ä¸æ¬¡ãâæè¯´ã
âå¯ï¼å¥ï¼ä½ 伿¯å§ï¼ææè¿äºä¾ååéæ°è·ä¸éãâä¸å¦¹è¯´ã
---
æè¿æ´çäºä¸ä»½çé¼çå¦ä¹ èµæï¼å
æ¬ä½ä¸éäºJavaåºç¡é¨åï¼JVMãJavaéåæ¡æ¶ãå¤çº¿ç¨ï¼ï¼è¿åæ¬äº **æ°æ®åºãè®¡ç®æºç½ç»ãç®æ³ä¸æ°æ®ç»æã设计模å¼ãæ¡æ¶ç±»SpringãNettyãå¾®æå¡ï¼Dubboï¼æ¶æ¯éåï¼ ç½å
³** ççççâ¦â¦è¯¦æ
æ³ï¼[å¯ä»¥è¯´æ¯2022å¹´å
¨ç½æå
¨çå¦ä¹ 忾工ä½çPDFèµæºäº](https://tobebetterjavaer.com/nice-article/itmind/nice-article/itmind/miansjavamsdhmsmsbdjavabdjavaxxzlmsxxzlmszlzlxzmszlfxjlzl.html)
å
³æ³¨äºå¥çååå
¬ä¼å· **æ²é»çäº**ï¼åå¤**111** å³å¯å
è´¹é¢åã
