基本型別、字串該注意的地方

fan_rockrock發表於2016-04-02

1、不同資料型別之間的轉換有哪些規則

(1)型別自動轉換:低等資料型別可以自動轉換為高等資料型別,需要注意以下幾點

               <1>char型別的資料轉換為高等型別(int,long等),會轉換為其對應的ASCII碼

       <2>byte、char、short型別的資料在參與運算時會自動轉換為int型,但當使用"+="運算時,就不會產生型別的轉換

       <3>基本資料型別不能與boolean型別相互轉換

        (2)強制型別轉換:當需要從高階資料型別轉為低階資料型別時,就需要進行強制型別轉換

2、char型變數中是否可以儲存一箇中文漢字

   在java語言中,預設採用的Unicode編碼方式,即每個字元佔用兩個位元組,因此可以儲存中文。String雖然由char組成,但是它採用的方式是:中文佔兩個位元組,英文佔一個位元組,這種方式大大節省儲存空間


3、java字串建立與儲存機制

        String s1 = "abc"; //在常量區中存放了一個"abc"的字串物件

        String s2 = "abc";//s2引用常量區中的物件,因此不會建立新的物件。

        String s3 = new String("abc");//在堆中建立新的物件

        String s4 = new String("abc");//在堆中又建立一個新的物件


new String("abc")建立了幾個物件?

answer:一個或者兩個。如果常量池中原來有字串"abc",那麼只建立一個物件;如果常量池中沒有字串"abc",那麼就建立兩個物件(這兩個物件分別位於字串常量池和堆中)。


4、String,StringBuffer與StringBuilder的區別??

String 字串常量
StringBuffer 字串變數(執行緒安全)
StringBuilder 字串變數(非執行緒安全)

       String 型別和 StringBuffer 型別的主要效能區別其實在於 String 是不可變的物件, 因此在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件,所以經常改變內容的字串最好不要用 String ,因為每次生成物件都會對系統效能產生影響,特別當記憶體中無引用物件多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的
        而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 物件本身進行操作,而不是生成新的物件,再改變物件引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字串物件經常改變的情況下。

       在某些特別情況下, String 物件的字串拼接其實是被 JVM 解釋成了 StringBuffer 物件的拼接,所以這些時候 String 物件的速度並不會比 StringBuffer 物件慢,而特別是以下的字串物件生成中, String 效率是遠要StringBuffer 快的:

String S1 = “This is only a” + “ simple” + “ test”;

StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你會很驚訝的發現,生成 String S1 物件的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不佔優勢。其實這是 JVM 的一個把戲,在 JVM 眼裡,這個
 String S1 = “This is only a” + “ simple” + “test”; 其實就是:
 String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。

StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

總結:

執行效率:StringBuilder>StringBuffer>String

運算元量比較少:String

單執行緒下操作大量資料:StringBuilder

多執行緒下操作大量資料:StringBuffer


5、length屬性和length()方法的區別

length()方法是針對字串而言的,length屬性是針對陣列而言的

相關文章