---
title: 为ä»ä¹Stringæ¯ä¸å¯åçï¼
shortTitle: 为ä»ä¹Stringæ¯ä¸å¯åçï¼
category:
- Javaæ ¸å¿
tag:
- æ°ç»&å符串
description: Javaç¨åºåè¿é¶ä¹è·¯ï¼å°ç½çé¶åºç¡Javaæç¨ï¼ä»å
¥é¨å°è¿é¶ï¼ä¸ºä»ä¹Stringæ¯ä¸å¯åçï¼
head:
- - meta
- name: keywords
content: Java,Java SE,Java åºç¡,Java æç¨,Java ç¨åºåè¿é¶ä¹è·¯,Java å
¥é¨,javaå符串,String
- name: description
content: Javaç¨åºåè¿é¶ä¹è·¯ï¼å°ç½çé¶åºç¡Javaæç¨ï¼ä»å
¥é¨å°è¿é¶ï¼ä¸ºä»ä¹Stringæ¯ä¸å¯åçï¼
---
ææ£å卿²å䏿´¥æ´¥æå³å°è¯»å欣大佬çãç å翻身ãââJava å¸å½è¿ä¸ç« ï¼é¨éåäºã起身æå¼é¨ä¸çï¼æ¯ä¸å¦¹ï¼å¥¹ä»å¦æ ¡åæ¥äºã
âä¸å¦¹ï¼ä½ 忥ççåæ¶ï¼ä»å¤©æä»¬æç®è®² Java ä¸çå符串å¢ãâçä¸å¦¹æ¢éçæ¶åæè¯´ã
âå¦ï¼å¯ä»¥åï¼å¥ãå¬è¯´å符串çç»èç¹å«å¤ï¼ä»ä¹åç¬¦ä¸²å¸¸éæ± äºãå符串ä¸å¯åæ§äºãåç¬¦ä¸²æ¼æ¥äºãå符串é¿åº¦éå¶äºççï¼ä½ æå¥½æ
¢æ
¢è®²ï¼å¦åæå¯è½ä¸æ¶å伿¶åä¸äºãâä¸å¦¹çæåº¦æ¾å¾å¾è¯æ³ã
âå¯ï¼æå·²ç»æ³å¥½äºï¼ä»å¤©å°±åªå¸¦ä½ 大æ¦è®¤è¯ä¸ä¸å符串ï¼å说说为ä»ä¹ String æ¯ä¸å¯åçï¼å
¶ä»çç»èå±ä»¬åé¢åæ
¢æ
¢è®²ï¼ä¿è¯ä½ è½åæ¶æ¶åãâ
â好ï¼é£å°±å¼å§å§ãâä¸å¦¹å·²ç»åå¤å¥½åå¨äºçµèæ¡çè¾¹ä¸ã
æåºäºä¸å£°åèµ°å°çµèæ¡åå䏿¥ï¼é¡ºææå¼ Intellij IDEAï¼å¹¶æ¾å°äº String çæºç ã
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
@Stable
private final byte[] value;
private final byte coder;
private int hash;
}
```
â第ä¸ï¼String ç±»æ¯ final çï¼æå³çå®ä¸è½è¢«å类继æ¿ãâ
â第äºï¼String ç±»å®ç°äº Serializable æ¥å£ï¼æå³çå®å¯ä»¥åºååãâ
â第ä¸ï¼String ç±»å®ç°äº Comparable æ¥å£ï¼æå³çæå¥½ä¸è¦ç¨â==âæ¥æ¯è¾ä¸¤ä¸ªå符串æ¯å¦ç¸çï¼èåºè¯¥ç¨ `compareTo()` æ¹æ³å»æ¯è¾ãâ
â第åï¼StringBufferãStringBuilder å String 䏿 ·ï¼é½å®ç°äº CharSequence æ¥å£ï¼æä»¥å®ä»¬ä»¨å±äºè¿äº²ãç±äº String æ¯ä¸å¯åçï¼æä»¥éå°åç¬¦ä¸²æ¼æ¥çæ¶åå°±å¯ä»¥èèä¸ä¸ String çå¦å¤ä¸¤ä¸ªå¥½å
å¼ï¼StringBuffer å StringBuilderï¼å®ä¿©æ¯å¯åçãâ
â第äºï¼Java 9 以åï¼[String æ¯ç¨ char åæ°ç»å®ç°çï¼ä¹åæ¹æäº byte åæ°ç»å®ç°ï¼å¹¶å¢å äº coder æ¥è¡¨ç¤ºç¼ç ](https://tobebetterjavaer.com/basic-extra-meal/jdk9-char-byte-string.html)ãå¨ Latin1 å符为主çç¨åºéï¼å¯ä»¥æ String å ç¨çå
ååå°ä¸åãå½ç¶ï¼å¤©ä¸æ²¡æå
è´¹çåé¤ï¼è¿ä¸ªæ¹è¿å¨èçå
åçåæ¶å¼å
¥äºç¼ç æ£æµçå¼éãâ
â第å
ï¼æ¯ä¸ä¸ªå符串é½ä¼æä¸ä¸ª hash å¼ï¼è¿ä¸ªåå¸å¼å¨å¾å¤§æ¦çæ¯ä¸ä¼éå¤çï¼å æ¤ String å¾é忥ä½ä¸º HashMap çé®å¼ãâ
âString å¯è½æ¯ Java ä¸ä½¿ç¨é¢çæé«çå¼ç¨ç±»åäºï¼å æ¤ String ç±»ç设计è
å¯ä»¥è¯´æ¯ç¨å¿è¯è¦ãâ
æ¯å¦è¯´ String çä¸å¯åæ§ã
- String 类被 final å
³é®åä¿®é¥°ï¼æä»¥å®ä¸ä¼æåç±»ï¼è¿å°±æå³ç没æåç±»å¯ä»¥éåå®çæ¹æ³ï¼æ¹åå®çè¡ä¸ºã
- String ç±»çæ°æ®åå¨å¨ `byte[]` æ°ç»ä¸ï¼èè¿ä¸ªæ°ç»ä¹è¢« final å
³é®å修饰äºï¼è¿å°±è¡¨ç¤º String å¯¹è±¡æ¯æ²¡æ³è¢«ä¿®æ¹çï¼åªè¦åå§å䏿¬¡ï¼å¼å°±ç¡®å®äºã
âå¥ï¼ä¸ºä»ä¹è¦è¿æ ·è®¾è®¡å¢ï¼âä¸å¦¹æäºä¸è§£ã
âæå
ç®åæ¥è¯´ä¸ï¼ä¸å¦¹ï¼è½ææå¥½ï¼ä¸è½æåé¢åç»è¯´ãâ
第ä¸ï¼å¯ä»¥ä¿è¯ String 对象çå®å
¨æ§ï¼é¿å
被篡æ¹ï¼æ¯ç«åå¯ç è¿ç§éç§ä¿¡æ¯ä¸è¬å°±æ¯ç¨å符串åå¨çã
第äºï¼ä¿è¯åå¸å¼ä¸ä¼é¢ç¹åæ´ãæ¯ç«è¦ç»å¸¸ä½ä¸ºåå¸è¡¨çé®å¼ï¼ç»å¸¸åæ´çè¯ï¼åå¸è¡¨çæ§è½å°±ä¼å¾å·®å²ã
第ä¸ï¼å¯ä»¥å®ç°åç¬¦ä¸²å¸¸éæ± ã
âç±äºå符串çä¸å¯åæ§ï¼String ç±»çä¸äºæ¹æ³å®ç°æç»é½è¿åäºæ°çå符串对象ãâçä¸å¦¹ç¨å¾®ç¼äºä¸ä¼åï¼æç»§ç»è¯´å°ã
âå°±æ¿ `substring()` æ¹æ³æ¥è¯´ãâ
```java
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = length() - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
if (beginIndex == 0) {
return this;
}
return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
: StringUTF16.newString(value, beginIndex, subLen);
}
// StringLatin1.newString
public static String newString(byte[] val, int index, int len) {
return new String(Arrays.copyOfRange(val, index, index + len),
LATIN1);
}
// UTF16.newString
public static String newString(byte[] val, int index, int len) {
if (String.COMPACT_STRINGS) {
byte[] buf = compress(val, index, len);
if (buf != null) {
return new String(buf, LATIN1);
}
}
int last = index + len;
return new String(Arrays.copyOfRange(val, index << 1, last << 1), UTF16);
}
```
`substring()` æ¹æ³ç¨äºæªåå符串ï¼ä¸ç®¡æ¯ Latin1 åç¬¦è¿æ¯ UTF16 åç¬¦ï¼æç»è¿åç齿¯ new åºæ¥çæ°å符串对象ã
âè¿æ `concat()` æ¹æ³ãâ
```java
public String concat(String str) {
int olen = str.length();
if (olen == 0) {
return this;
}
if (coder() == str.coder()) {
byte[] val = this.value;
byte[] oval = str.value;
int len = val.length + oval.length;
byte[] buf = Arrays.copyOf(val, len);
System.arraycopy(oval, 0, buf, val.length, oval.length);
return new String(buf, coder);
}
int len = length();
byte[] buf = StringUTF16.newBytesFor(len + olen);
getBytes(buf, 0, UTF16);
str.getBytes(buf, len, UTF16);
return new String(buf, UTF16);
}
```
`concat()` æ¹æ³ç¨äºæ¼æ¥å符串ï¼ä¸ç®¡ç¼ç æ¯å¦ä¸è´ï¼æç»ä¹è¿åçæ¯æ°çå符串对象ã
â`replace()` æ¿æ¢æ¹æ³å
¶å®ä¹ä¸æ ·ï¼ä¸å¦¹ï¼ä½ å¯ä»¥èªå·±ä¸ä¼çä¸ä¸æºç ï¼ä¹æ¯è¿åæ°çå符串对象ãâ
âè¿å°±æå³çï¼ä¸ç®¡æ¯æªåãæ¼æ¥ï¼è¿æ¯æ¿æ¢ï¼é½ä¸æ¯å¨åæçå符串ä¸è¿è¡çï¼èæ¯éæ°çæäºæ°çå符串对象ãä¹å°±æ¯è¯´ï¼è¿äºæä½æ§è¡è¿åï¼**忥çå符串对象并没æåçæ¹å**ãâ
âä¸å¦¹ï¼ä½ è®°ä½ï¼String å¯¹è±¡ä¸æ¦è¢«å建åå°±åºå®ä¸åäºï¼å¯¹ String 对象çä»»ä½ä¿®æ¹é½ä¸ä¼å½±åå°åæ¥çå符串对象ï¼é½ä¼çææ°çå符串对象ãâ
âå¯å¯ï¼è®°ä½äºï¼å¥ãâä¸å¦¹å¾ä¹ã
âé£ä»å¤©å°±å
讲å°è¿å§ï¼å颿们å对æ¯ä¸ä¸ªç»åé¢åæ·±å
¥å°å±å¼ä¸ä¸ãä½ å¯ä»¥æ¾ä¸äºèµæå
é¢ä¹ ä¸ï¼æåºå»æ£ä¼å¿ãããããâ
---
æè¿æ´çäºä¸ä»½çé¼çå¦ä¹ èµæï¼å
æ¬ä½ä¸éäºJavaåºç¡é¨åï¼JVMãJavaéåæ¡æ¶ãå¤çº¿ç¨ï¼ï¼è¿åæ¬äº **æ°æ®åºãè®¡ç®æºç½ç»ãç®æ³ä¸æ°æ®ç»æã设计模å¼ãæ¡æ¶ç±»SpringãNettyãå¾®æå¡ï¼Dubboï¼æ¶æ¯éåï¼ ç½å
³** ççççâ¦â¦è¯¦æ
æ³ï¼[å¯ä»¥è¯´æ¯2022å¹´å
¨ç½æå
¨çå¦ä¹ 忾工ä½çPDFèµæºäº](https://tobebetterjavaer.com/nice-article/itmind/nice-article/itmind/miansjavamsdhmsmsbdjavabdjavaxxzlmsxxzlmszlzlxzmszlfxjlzl.html)
å
³æ³¨äºå¥çååå
¬ä¼å· **æ²é»çäº**ï¼åå¤**111** å³å¯å
è´¹é¢åã
