筆記---String相關


String學習
主要問題:

    1.string是如何實現的

        string內部存儲結構是char數組

    2.string有哪些主要的方法

        多構造方法:

            以string爲參數的構造方法

            以char數組爲參數的構造方法

            以stringbuffer爲參數的構造方法

            以stringbuilder爲參數的構造方法
*
        equals比較方法
            
接收object類型的參數,首先用instanceof判斷是否是同一類型,不是直接返回false,然後在循環比較(while)每個字符。重寫了object的equals方法

        compareTo比較方法

            也是循環比較,返回正數負數或者0,return char[1] - char[2]。

        兩個比較方法的不同:

            equals可以接收object類型的參數。compareTo只能接受string類型的參數;
            equals返回值是布爾類型,compareTo返回值類型是int。

        其他方法:

            indexOf():查詢字符串首次出現的下標位置

            lastIndexOf():查詢字符串最後出現的下標位置

            contains():查詢字符串中是否包含另一個字符串

            toLowerCase():將字符串全部轉化成小寫

            toUpperCase():將字符串全部轉化成大寫

            length():查詢字符串長度

            trim():去掉字符串首尾空格

            replace():替換字符串中的某些字符

            split():分割字符串返回字符串數組

            join():把字符串數組轉化爲字符串
面試經典問題:
    1.爲什麼string類型用final修飾?
        用final修飾可以緩存結果(常量池緩存),當在傳參是不需要考慮他的值是否會被修改,如果是可變類,有可能需要重新拷貝出一個新的值進行傳參,在性能上有一定的損失。
        在一個原因就是安全、高效。
    2.==和equals有什麼區別?
        ==對於基本數據類型來說,適用於比較“值”是否是相等的,而對於引用類型來說,是用於比較引用地址是否是相等的。
        Object的equals方法實現就是==,string重寫了object的equals方法,將引用對比改成字符串對比,用來比較兩個字符串的值是否相等。
    3.string和stringbuffer、stringbuilder有什麼區別?
        string類型不可變,字符串拼接時效率低。
        stringbuffer用synchronize修飾拼接方法,線程安全,但是併發量高的情況下效率低;
        stringbuilder線程不安全,併發量高的情況下效率高。
    4.string的intern()方法有什麼含義?
        將該值保存到到常量池。
    5.string類在JVM中是如何存儲的?編譯器對string做了哪些優化?
        string兩種創建方法:
            ①:String s1 = “java”; 
            ②:String s2 = new String("java"); 
        這兩種創建方法在JVM中存儲區域截然不同,s1會現在常量池中尋找值,找到值之後直接返回,找不到則在常量池中創建;s2直接在堆內存中創建新的string對象,調用intern()方法後纔會將該值放到常量池中。(JDK1.7之後將永生代換成元空間,把字符串常量池從方法區移到java堆上)
            ③:String s3 = "ja"+"va";
        如果打印s1 == s3,輸出結果是true,在JVM編譯的時候s3被直接編譯成“java”。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章