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”。