面试中关于String、StringBuffer、StringBuilder的频率最高问题
1、String類的特性
String類 是final修飾的,不可以被繼承。
String類的底層是基于char數組的。
安全性:
對象都是只讀的,所以多線程并發訪問也不會有任何問題。
由于不可變,用來存儲數據也是極為安全的。
2、String和new String();的區別
例如 : String str1= “abc” ??和 String ?str2 ?= new String("abc")的區別
解答 :?先理解一句話,再看下面的解析:相等的字符串 在常量池中只有一份,在堆中有多份
String str1= “abc”; 在編譯期,JVM會去常量池來查找是否存在“abc”,如果不存在,就在常量池中開辟一個空間來存儲“abc”;如果存在,就不用新開辟空間。然后在棧內存中開辟一個名字為str1的空間,來存儲“abc”在常量池中的地址值。
String str2 = new String("abc") ;在編譯期,JVM先去常量池中查找是否存在“abc”,如果不存在,則在常量池中開辟一個空間存儲“abc”。在運行時期,通過String類的構造器在堆內存中new了一個空間,然后將String池中的“abc”復制一份存放到該堆空間中,在棧中開辟名字為str2的空間,存放堆中new出來的這個String對象的地址值。
也就是說,前者在初始化的時候可能創建了一個對象,也可能一個對象也沒有創建;后者因為new關鍵字,至少在內存中創建了一個對象,也有可能是兩個對象。
3、new String(); 創建了幾個對象
解答: 兩個
首先String str是定義了一個字符串變量,并未產生對象,=不產生對象,那么只有后面的new String("abc")了。把它拆分成"abc"和new String(),首先在字符串常量池去尋找有沒有"abc"這個字符串,沒有就創建一個“abc”字符串對象在棧中,然后new String把這個字符串對象拷貝一份到堆中,返回這個對象的引用。所以一共產生兩個對象
試問str變量存儲在堆中還是棧中?關鍵點是區分str是成員變量還是局部變量,如果是局部變量在方法體內,它就存儲在棧中,如果是成員變量那么久跟隨成員對象存儲在堆中。
4、==與equals()的區別
解答:==比較的是引用類型 比較的是地址值是否相同 ? equals()比較的是內容(堆中的內容是否相同)
? ? ? ? ? ? ==是一個運算符 ??equals則是String對象的方法
例如:
String str1 = new String(“abc”) ???????str1 != str2 ? ?
String str2 = new String("abc") ??
String str3 = "ABC" ?????????????????????????str3 = str4
String str4 = "ABC" ?????????????????????????str3 = str4 = str5
String str5 = "A"+"BC"; ?
5、基本數據類型有哪幾種
?
6、String和StringBuffer的轉換
?
String轉StringBuffer: ??String ?s ?= new String("xxx");
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? StringBuffer sb = new StringBuffer(s); ?
StringBuffer轉String: ?String str = sb.toString();
?
7、String 和StringBuffer ?StringBuilder的區別
區別:
執行速度:StringBulider>StringBuffer>String
StringBulider和StringBuffer是變量(String是常量)
?線程安全 :StringBuffer>StringBulider>String
解析:
String中的對象是不可變的,也就可以理解為常量,顯然線程安全。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。
StringBuilder并沒有對方法進行加同步鎖,所以是非線程安全的。
如果程序不是多線程的,那么使用StringBuilder效率高于StringBuffer。? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結 ?: ?
1.如果要操作少量的數據用 =》 String
2.單線程操作字符串緩沖區 下操作大量數據 = 》StringBuilder
3.多線程操作字符串緩沖區 下操作大量數據 = 》StringBuffer
7、擴展
?String的一種方式比StringBuffer快的多 ?
例如:
String ?s ?= "hello"+"you"+"hao"這種方式比StringBuffer的append()快的多,這就被jvm解析成StringBuffer對象的拼接 ???
String s = "hello" String s2 = "you" ??String s3 = "hao" ??String s4 = s+s2+s3 ?這種方式比StringBuffer慢的多,這樣jvm就規規矩矩的拼接String字符串了
今天大概總結到這里,此文章有參考其他博主的,有自己總結的,如果以后還遇到關于String的問題,再向其中添加
?
May everyone be happy every day and everything go well!
總結
以上是生活随笔為你收集整理的面试中关于String、StringBuffer、StringBuilder的频率最高问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getX(),getY()等方法的区别(
- 下一篇: 简单页面跳转生命周期(简单清晰)