# String
## æ¦è§
String 被声æä¸º finalï¼å æ¤å®ä¸å¯è¢«ç»§æ¿ã
**å
é¨ä½¿ç¨ char æ°ç»å卿°æ®ï¼è¯¥æ°ç»è¢«å£°æä¸º final**ï¼
è¿æå³ç value æ°ç»åå§åä¹åå°±ä¸è½åå¼ç¨å
¶å®æ°ç»ã
å¹¶ä¸ String å
鍿²¡ææ¹å value æ°ç»çæ¹æ³ï¼å æ¤å¯ä»¥ä¿è¯ String ä¸å¯åã
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
```
## ä¸å¯åç好å¤
**1. å¯ä»¥ç¼å hash å¼**
å 为 String ç hash å¼ç»å¸¸è¢«ä½¿ç¨ï¼ä¾å¦ String ç¨å HashMap ç keyã
ä¸å¯åçç¹æ§å¯ä»¥ä½¿å¾ hash å¼ä¹ä¸å¯åï¼å æ¤åªéè¦è¿è¡ä¸æ¬¡è®¡ç®ã
**2. String Pool çéè¦**
妿ä¸ä¸ª String 对象已ç»è¢«å建è¿äºï¼é£ä¹å°±ä¼ä» String Pool ä¸åå¾å¼ç¨ã
åªæ String æ¯ä¸å¯åçï¼æå¯è½ä½¿ç¨ String Poolã
**3. å®å
¨æ§**
String ç»å¸¸ä½ä¸ºåæ°ï¼String ä¸å¯åæ§å¯ä»¥ä¿è¯åæ°ä¸å¯åãä¾å¦å¨ä½ä¸ºç½ç»è¿æ¥åæ°çæ
åµä¸å¦æ String æ¯å¯åçï¼é£ä¹å¨ç½ç»è¿æ¥è¿ç¨ä¸ï¼String 被æ¹åï¼æ¹å String 对象çé£ä¸æ¹ä»¥ä¸ºç°å¨è¿æ¥çæ¯å
¶å®ä¸»æºï¼èå®é
æ
åµå´ä¸ä¸å®æ¯ã
**4. 线ç¨å®å
¨**
String ä¸å¯åæ§å¤©çå
·å¤çº¿ç¨å®å
¨ï¼å¯ä»¥å¨å¤ä¸ªçº¿ç¨ä¸å®å
¨å°ä½¿ç¨ã
[Program Creek : Why String is immutable in Java?](https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/)
## String, StringBuffer and StringBuilder
**1. å¯åæ§**
- String ä¸å¯å
- StringBuffer å StringBuilder å¯å
**2. 线ç¨å®å
¨**
- String ä¸å¯åï¼å æ¤æ¯çº¿ç¨å®å
¨ç
- StringBuilder 䏿¯çº¿ç¨å®å
¨ç
- StringBuffer æ¯çº¿ç¨å®å
¨çï¼å
é¨ä½¿ç¨ synchronized è¿è¡åæ¥
**3. æ§è½**
- Javaä¸å¯¹String对象è¿è¡çæä½å®é
䏿¯ä¸ä¸ªä¸æå建æ°ç对象并ä¸å°æ§çå¯¹è±¡åæ¶çä¸ä¸ªè¿ç¨ï¼æä»¥æ§è¡éåº¦å¾æ
¢
- StringBufferæ¯æ¬¡é½ä¼å¯¹StringBuffer对象æ¬èº«è¿è¡æä½ï¼è䏿¯çææ°ç对象并æ¹å对象å¼ç¨
- StringBuilderæ¯æ¬¡é½ä¼å¯¹StringBuilder对象æ¬èº«è¿è¡æä½ï¼è䏿¯çææ°ç对象并æ¹å对象å¼ç¨ã
ç¸åæ
åµä¸ä½¿ç¨StirngBuilderç¸æ¯ä½¿ç¨ StringBuffer ä»
è½è·å¾ 10%~15% å·¦å³çæ§è½æåï¼ä½å´åå¤çº¿ç¨ä¸å®å
¨çé£é©ã
> **ä¸è
使ç¨çæ»ç»**
- æä½å°éçæ°æ®ï¼ä½¿ç¨String
- åçº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®ï¼ä½¿ç¨StringBuilder
- å¤çº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®ï¼ä½¿ç¨StringBuffer
äºè§£: StringåStringBufferçç¸äºè½¬æ¢
ï¼1ï¼String --> StringBuffer
æ¹å¼ä¸ï¼æé æ¹æ³ StringBuffer sb=new StringBuffer(s);
æ¹å¼äºï¼éè¿append()æ¹æ³ StringBuffer sb=new StringBuffer(); sb.append(s);
ï¼2ï¼StringBuffer --> String
æ¹å¼ä¸ï¼æé æ¹æ³ String s=new String(buffer);
æ¹å¼äºï¼éè¿toString()æ¹æ³ String s=buffer.toString();
## String Pool
åç¬¦ä¸²å¸¸éæ± ï¼String Poolï¼ä¿åçææå符串åé¢éï¼literal stringsï¼ï¼è¿äºåé¢éå¨ç¼è¯æ¶æå°±ç¡®å®ã
ä¸ä»
妿¤ï¼è¿å¯ä»¥ä½¿ç¨ String ç **intern() æ¹æ³å¨è¿è¡è¿ç¨ä¸å°å符串添å å° String Pool ä¸**ã
å½ä¸ä¸ªå符串è°ç¨ intern() æ¹æ³æ¶ï¼å¦æ String Pool ä¸å·²ç»åå¨ä¸ä¸ªå符串å该å符串å¼ç¸çï¼ä½¿ç¨ equals() æ¹æ³è¿è¡ç¡®å®ï¼ï¼
é£ä¹å°±ä¼è¿å String Pool ä¸å符串çå¼ç¨ï¼
å¦åï¼å°±ä¼å¨ String Pool 䏿·»å ä¸ä¸ªæ°çå符串ï¼å¹¶è¿åè¿ä¸ªæ°å符串çå¼ç¨ã
ä¸é¢ç¤ºä¾ä¸ï¼s1 å s2 éç¨ new String() çæ¹å¼æ°å»ºäºä¸¤ä¸ªä¸åå符串ï¼
è s3 å s4 æ¯éè¿ s1.intern() æ¹æ³åå¾ä¸ä¸ªå符串å¼ç¨ã
intern() é¦å
æ s1 å¼ç¨çå符串æ¾å° String Pool ä¸ï¼ç¶åè¿åè¿ä¸ªå符串å¼ç¨ã
å æ¤ s3 å s4 å¼ç¨çæ¯åä¸ä¸ªå符串ã
```java
String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2); // false
String s3 = s1.intern();
String s4 = s1.intern();
System.out.println(s3 == s4); // true
```
妿æ¯éç¨ "bbb" è¿ç§åé¢éçå½¢å¼å建å符串ï¼ä¼èªå¨å°å°å符串æ¾å
¥ String Pool ä¸ã
```java
String s5 = "bbb";
String s6 = "bbb";
System.out.println(s5 == s6); // true
```
å¨ Java 7 ä¹åï¼String Pool 被æ¾å¨è¿è¡æ¶å¸¸éæ± ä¸ï¼å®å±äºæ°¸ä¹
代ã
èå¨ Java 7ï¼String Pool 被移å°å ä¸ãè¿æ¯å 为永ä¹
代çç©ºé´æéï¼å¨å¤§é使ç¨å符串çåºæ¯ä¸ä¼å¯¼è´ OutOfMemoryError é误ã
## new String("abc")
使ç¨è¿ç§æ¹å¼ä¸å
±ä¼å建两个å符串对象ï¼åææ¯ String Pool ä¸è¿æ²¡æ "abc" å符串对象ï¼ã
- "abc" å±äºå符串åé¢éï¼å æ¤ç¼è¯æ¶æä¼å¨ String Pool ä¸å建ä¸ä¸ªåç¬¦ä¸²å¯¹è±¡ï¼æåè¿ä¸ª "abc" å符串åé¢éï¼
- èä½¿ç¨ new çæ¹å¼ä¼å¨å ä¸å建ä¸ä¸ªå符串对象ã
å建ä¸ä¸ªæµè¯ç±»ï¼å
¶ main æ¹æ³ä¸ä½¿ç¨è¿ç§æ¹å¼æ¥å建å符串对象ã
```java
public class NewStringTest {
public static void main(String[] args) {
String s = new String("abc");
}
}
```
ä½¿ç¨ javap -verbose è¿è¡åç¼è¯ï¼å¾å°ä»¥ä¸å
容ï¼
```java
// ...
Constant pool:
// ...
#2 = Class #18 // java/lang/String
#3 = String #19 // abc
// ...
#18 = Utf8 java/lang/String
#19 = Utf8 abc
// ...
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String abc
6: invokespecial #4 // Method java/lang/String."":(Ljava/lang/String;)V
9: astore_1
// ...
```
å¨ Constant Pool ä¸ï¼#19 åå¨è¿å符串åé¢é "abc"ï¼#3 æ¯ String Pool çå符串对象ï¼å®æå #19 è¿ä¸ªå符串åé¢éãå¨ main æ¹æ³ä¸ï¼0: è¡ä½¿ç¨ new #2 å¨å ä¸å建ä¸ä¸ªå符串对象ï¼å¹¶ä¸ä½¿ç¨ ldc #3 å° String Pool ä¸çå符串对象ä½ä¸º String æé 彿°çåæ°ã
以䏿¯ String æé 彿°çæºç ï¼å¯ä»¥çå°ï¼å¨å°ä¸ä¸ªå符串对象ä½ä¸ºå¦ä¸ä¸ªå符串对象çæé 彿°åæ°æ¶ï¼å¹¶ä¸ä¼å®å
¨å¤å¶ value æ°ç»å
容ï¼èæ¯é½ä¼æååä¸ä¸ª value æ°ç»ã
```java
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
```
äºè§£ï¼è¯´è¯´String s=new String("aaa")åString s="aaa"çåºå«ï¼
- åè
ä¼å建ä¸ä¸ªæè
å¤ä¸ªå¯¹è±¡
- åè
åªä¼å建ä¸ä¸ªæè
é¶ä¸ªå¯¹è±¡