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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

面试字节我被String类的问题给问死了!

發布時間:2023/12/4 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试字节我被String类的问题给问死了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


“+” 是怎么連接字符串的?(JDK1.7及以上)

總結:

使用 “+” 連接字符串時,實際上是使用臨時創建的StringBuilder對象來輔助完成的。
對于編譯時常量,在編譯后直接計算出字符串的值,而不會在運行時創建臨時的StringBuilder對象來完成字符串連接。
在循環中對String對象進行連接,應該直接使用StringBuilder代替 “+”,這樣可以提高性能。
注意: 當使用運算符 “+” 連接字符串時,如果兩個操作數都是編譯時常量,則在編譯時期就會計算該字符串的值,而不會在運行時創建StringBuilder對象。

final String s = "abc"; String x = "abc" + "def"; // 兩個操作數都是常量,運行時不會創建StringBuilder對象 String y = s + "def"; // s和"def"都是編譯時常量,不會創建StringBuilder對象,實際上x和y指向同一個對象,即"abcdef" String z = y + "abc"; // y是變量,則在運行時會創建StringBuilder對象

不可修改的String對象

<1> 問:String對象一經創建,不能修改,為什么?

因為String類是final類型的,無法繼承該類。

其所有的成員變量都是private的,并且沒有提供修改私有成員變量的公有(public)方法
對String對象的操作都沒有修改當前對象,而是新創建一個對象

<2> 問:把String對象設計成不可修改有什么好處嗎?

最大好處就是可以實現資源共享,多線程操作時,具有線程安全性。

總結三點:

  • String類是final類型的,其對象一旦創建,不可修改。
  • String類那些看似修改字符序列的方法實際上都是返回新創建的String對象,而不是修改自身對象。
  • String對象不可改變,因此具有線程安全性,可自由實現共享。

String類的內部實現
在String類內部,使用一個字符數組char[]來維護字符序列。

private final char value[];

問:String的最大長度是多少?

String的最大長度也就是字符數組char[]的最大長度,理論上為int類型的最大值,即2147483647,實際上,一般可獲取的最大值小于理論最大值。

申請一個int最大值長度字符數組:

char c = new char[Integer.MAX_VALUE]; // 報錯

報錯:一個char類型占用2字節,Integer.MAX_VALUE個char類型接近于4GB大小,申請這么大一塊連續內存空間,導致內存溢出。
//加入Java開發交流君樣:756584822一起吹水聊天

分析:Java中的對象是分配在堆上的,默認的堆空間的最大值是256MB,在理想的情況下,只要我們將最大Java堆設置的足夠大,就可以申請到最大的字符長度,即Integer.MAX_VALUE。

java -Xmx1G com.fan.fragmentlearning.str.StringDemoMain – 設置Main方法最大Java堆

String常量池

<1> 什么是String常量池?

String常量池是String類內部私有的,能夠自動將String字面常量加入其中。
起初,常量池是空的,當程序中出現String字面常量時,會在常量池中搜索是否存在該String對象,即使用String類的equals方法來判斷,如果不存在,就將這個字面常量加入常量池中,并返回該對象;否則直接返回常量池中的對象。

<2> String字面常量和String常量表達式都會加入常量池中。

<3> 滿足什么條件才算是String常量表達式呢?

即就是在編譯的時候就可以確定其值的String類型表達式。編譯器的原則是:能在編譯期間計算的,就不會留到運行時再去計算。

第一種: 表達式全部由String字面常量拼接

String s = "a" + "b" + "c";

第二種: 表達式由String字面常量,基本類型字面常量,final修飾的String引用,final修飾的基本數據類型任意組合組成。

String s = "a" + 5; // String常量表達式final String str = "a"; String s = "bc" + str; // String常量表達式final int num = 5; String s = "a" + num; // String常量表達式String s = str + num; // String常量表達式

<4> intern方法 - 拘留字符串

如果需要將某個String對象加入常量池中,就可以調用intern方法來完成,這個操作也稱作拘留字符串。
系統自動將String字面常量與String常量表達式的字符串值加入常量池中,也是通過調用intern方法來實現的。

要點總結:

String類維護一塊特殊的區域,稱為常量池。因為String對象是不可改變的,因此沒有必要創建兩個相同的String對象。只需將String對象加入常量池,在需要的時候取出,這樣即可實現String對象的共享。
在程序中出現String編譯時常量(String字面常量與String常量表達式),會自動調用intern方法,如果常量池中含有相等的String對象(使用String類的equals方法來判斷),則直接返回常量池中的對象;否則將對象加入常量池中并返回該對象。
對于運行時創建的String對象(非String編譯時常量),會分配到堆中,系統不會自動調用intern方法拘留該對象,不過我們依然可以自行調用該對象的intern方法對該對象進行拘留。

最后,祝大家早日學有所成,拿到滿意offer

總結

以上是生活随笔為你收集整理的面试字节我被String类的问题给问死了!的全部內容,希望文章能夠幫你解決所遇到的問題。

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