java中的String類的一點認識

來源:互聯網
上載者:User

標籤:

這是學習中用到的一些基礎知識

String 是經常會用到的一個類,學習的過程中發現的東西進行的匯總。

1. 初始化方面:

  String類是一個比較特別的類,初始化的時候有種簡化的特殊文法。

  1>String s = "abc";

  而按照正規的文法來說,應該是:

  2>String s = new String ("abc");

  建議使用1>的方式,原因在於這樣比較節省記憶體空間,從其他網站上照抄下來的說法是,【只是按照物件導向的標準文法,在記憶體使用量上存在比較大的浪費。例如         String s = new String(“abc”);實際上建立了兩個String對象,一個是”abc”對象,儲存在常量空間中,一個是使用new關鍵字為對象s申請的空間。】

  下面是簡單的代碼

  

1         String a = "abc";2         String b = "abc";3         System.out.println(a==b);

  列印的結果是True。這裡的代碼含義在於,建立了String類型的引用變數,a和b,a和b指向了值為"abc"的String類,至於是不是建立的String類型的對象,需要根據代碼的前後文進行分析(因為JVM會自動根據棧中資料的實際情況來決定是否有必要建立新對象)。結果為True,代表這至少第二行代碼沒有重新建立一個String類型的對象,而是指向了存在的"abc"的對象,所以a 和 b 指向的是同一個對象,必然兩者是相等的。

  再如下面的代碼:

1         String d = new String("abc");2         String e = new String("abc");3         System.out.println(d==e);

  列印的結果是False,即 d, e兩個String類型的引用是指向不同的對象,1,2行代碼的處理邏輯是: 不管其字串值是否相等,是否有必要建立新對象,都會建立新的對象。

  另外研究到這裡的時候,發現代碼1中,提出了一個設計模式的思想-享元模式,即複用記憶體中已經存在的對象,降低系統建立對象執行個體的效能消耗。至於更多的分析可能會隨著學習逐步的深入

2. String的唯讀特性

  String是一個常量,在初始化的時候,一旦建立就不能再被改變,所以看起來是修改了String值的方法,其內部的邏輯並非如此。如下面的代碼:

  

1 String a1 = "first";2 System.out.println(a1 + ", second");

  列印之後是“first, second”,其實內部邏輯上來看,其實是產生了一個新的String對象,而不是在原有的String對象上追加內容。

  而java的內部處理方式上有說法是通過StringBuilder 這個類來實現字串的拼接。所以大膽假設下,以上的代碼等同於如下的實現方式:

1 StringBuilder stringBuilder = new StringBuilder();2 stringBuilder.append(a1);3 stringBuilder.append(", second");4 System.out.println(stringBuilder.tostring());

  通過上面的代碼可以看出,如果假設是成立的情況下,在進行字串拼接的時候如果使用的“String + ”的方式進行的,而在java內部是通過StringBuilder的方式來實現的話,那會建立一個StringBuilder對象來處理,單個的情況下不會有太多額外消耗,但是如果在迴圈體中使用了“String +”的方式,會不斷進入迴圈的時候不端建立StringBuilder對象,這樣反倒是有增加記憶體開支的嫌疑。所以如果以上假設都成立的話,在使用到字串拼接的時候,乾脆使用StringBuilder 的方式不是更好嗎?省的轉換成StringBuilder的方式後還得在每次迴圈中不斷的建立StringBuilder對象。

3. equals 和 “==”的區別

簡單的說,String的 equals()方法比較字串對象中的字元, == 運算子比較的是兩個對象是否引用同一執行個體,代碼如下:

 

1         String s1 = "Hello";2         String s2 = new String(s1);3         System.out.println(s1.equals(s2)); //True 4         System.out.println(s1==s2); //False

 

這個代碼就比較簡單了,看下面是equals的實現方法

public boolean equals(Object anObject) {    if (this == anObject) { //判斷是否同一對象        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;//String類型        int n = count;        //一個字元一個字元的比較        if (n == anotherString.count) {        char v1[] = value;        char v2[] = anotherString.value;        int i = offset;        int j = anotherString.offset;        while (n-- != 0) {            if (v1[i++] != v2[j++])            return false;        }        return true;        }    }    return false;    }    

從源碼中可以看得出比較的是字串中的字元是否完全相等。看源碼是個好習慣,要有耐心。

 

 

  

 

java中的String類的一點認識

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.