1. 程式人生 > >Java String類學習筆記

Java String類學習筆記

開發十年,就只剩下這套架構體系了! >>>   

String 不是java中的基本型別,在java中,字串屬於物件,Java 提供了 String 類來建立和操作字串。

  • 建立字元的兩種方式

        String 類是不可改變的,所以你一旦建立了 String 物件,那它的值就無法改變了

String  message = "hello";
        System.out.println(message);
        
        char []  mes_1= {'h','e','l','l','o'};
        String message_1 = new String(mes_1);
        System.out.println(message_1);
  1. String類是final類,也即意味著String類不能被繼承,並且它的成員方法都預設為final方法。在Java中,被final修飾的類是不允許被繼承的,並且該類中的成員方法都預設為final方法。
  2. String類其實是通過char陣列來儲存字串的。
  3. 無論是sub操作、concat還是replace操作都不是在原有的字串上進行的,而是重新生成了一個新的字串物件。也就是說進行這些操作後,最原始的字串並沒有被改變。“String物件一旦被建立就是固定不變的了,對String物件的任何改變都不影響到原物件,相關的任何change操作都會生成新的物件”
  4. 使用String不一定建立物件,使用new String,一定建立物件

        在執行到雙引號包含字串的語句時,如String a = "123",JVM會先到常量池裡查詢,如果有的話返回常量池裡的這個例項的引用,否則的話建立一個新例項並置入常量池裡。所以,當我們在使用諸如String str = "abc";的格式定義物件時,總是想當然地認為,建立了String類的物件str。擔心陷阱!物件可能並沒有被建立!而可能只是指向一個先前已經建立的物件。

只有通過new()方法才能保證每次都建立一個新的物件。

    5.關於equals和==

(1)對於==,如果作用於基本資料型別的變數(byte,short,char,int,long,float,double,boolean ),則直接比較其儲存的"值"是否相等;如果作用於引用型別的變數(String),則比較的是所指向的物件的地址(即是否指向同一個物件)。

(2)equals方法是基類Object中的方法,因此對於所有的繼承於Object的類都會有該方法。在Object類中,equals方法是用來比較兩個物件的引用是否相等,即是否指向同一個物件。

(3)對於equals方法,注意:equals方法不能作用於基本資料型別的變數。如果沒有對equals方法進行重寫,則比較的是引用型別的變數所指向的物件的地址;而String類對equals方法進行了重寫,用來比較指向的字串物件所儲存的字串是否相等。其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的物件所儲存的內容是否相等。

    6. String、StringBuffer、StringBuilder的區別

(1)可變與不可變:String是不可變字串物件,StringBuilder和StringBuffer是可變字串物件(其內部的字元陣列長度可變)。

(2)是否多執行緒安全:String中的物件是不可變的,也就可以理解為常量,顯然執行緒安全

        StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,只是StringBuffer 中的方法大都採用了synchronized 關鍵字進行修飾,因此是執行緒安全的,而 StringBuilder 沒有這個修飾,可以被認為是非執行緒安全的。

(3)String、StringBuilder、StringBuffer三者的執行效率:
       StringBuilder > StringBuffer > String 當然這個是相對的,不一定在所有情況下都是這樣。

       比如String str = "hello"+ "world"的效率就比 StringBuilder st  = new StringBuilder().append("hello").append("world")要高。

       因此,這三個類是各有利弊,應當根據不同的情況來進行選擇使用:
       當字串相加操作或者改動較少的情況下,建議使用 String str="hello"這種形式;
       當字串相加操作較多的情況下,建議使用StringBuilder,如果採用了多執行緒,則