Java String

作者:ouyangyewei
個(gè)人站點(diǎn):http://ouyangyewei.me/


String類

String類是不可變類

下面代碼片段摘自java.lang.String

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

可見,String類使用final關(guān)鍵字修飾,是不可變類,因此不可被繼承;

字符串的內(nèi)存形態(tài)

String對(duì)象在內(nèi)存中使用不可變的char型數(shù)組來存放字符串,因此String對(duì)象在創(chuàng)建后,其值就不可被改變(對(duì)于修改已存在的String對(duì)象的值,實(shí)際上是會(huì)創(chuàng)建一個(gè)新的String對(duì)象,可參考java.lang.String.concat方法的實(shí)現(xiàn))

下面代碼摘自java.lang.String

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);
}

下面代碼摘自java.util.Arrays

public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
java.lang.String.concat
java.lang.String.concat

String中的"+"操作符

引用String類的注釋

The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined by Object and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.

Java中,String的"+"操作符,是通過StringBuilder(或StringBuffer)類和它的append方法實(shí)現(xiàn)的,下面以一段代碼來證明:

public class Turtle {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        String c = "c";
        String d = a + b + c;
    }
}

對(duì)應(yīng)的字節(jié)碼:

public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
    stack=2, locals=5, args_size=1
       0: ldc           #2  // String a
       2: astore_1
       3: ldc           #3  // String b
       5: astore_2
       6: ldc           #4  // String c
       8: astore_3
       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: aload_3
      25: invokevirtual #7  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: invokevirtual #8  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      31: astore        4
      33: return
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      34     0  args   [Ljava/lang/String;
          3      31     1     a   Ljava/lang/String;
          6      28     2     b   Ljava/lang/String;
          9      25     3     c   Ljava/lang/String;
         33       1     4     d   Ljava/lang/String;

可見,"+"的操作,實(shí)際上會(huì)創(chuàng)建一個(gè)StringBuilder對(duì)象,先后調(diào)用append()方法,添加字符串"a","b","c",最后調(diào)用toString()方法返回一個(gè)String對(duì)象


參考材料

Java SE java.lang.String

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.String是不可變類。 不可變類呢?一般認(rèn)為:當(dāng)對(duì)象一旦創(chuàng)建完成后,在正常情況下,對(duì)象的狀態(tài)不會(huì)因外界的改變...
    時(shí)待吾閱讀 495評(píng)論 0 2
  • java中String的常用方法 1、length()字符串的長(zhǎng)度 例:char chars[]={'a','b'...
    赤赤有名閱讀 2,195評(píng)論 0 10
  • String、StringBuilder、StringBuffer 都是用來處理字符串的。 它們的異同點(diǎn): 1) ...
    keepgoingxjw閱讀 674評(píng)論 0 0
  • 每個(gè)基本類型封裝類都有將string轉(zhuǎn)換為基本數(shù)據(jù)類型的方法對(duì)于非常大的數(shù)字請(qǐng)使用Long,代碼如下* 將char...
    暖熊熊閱讀 1,889評(píng)論 0 3
  • 前面我們總結(jié)了數(shù)組操作,這里我們將總結(jié)字符串相關(guān)的知識(shí),除了總結(jié)String的API用法,同時(shí)我們還會(huì)總結(jié)一些相關(guān)...
    HCherisher閱讀 3,756評(píng)論 2 6

友情鏈接更多精彩內(nèi)容