日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试中关于String、StringBuffer、StringBuilder的频率最高问题

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试中关于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的频率最高问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。