Java中關於String字串的詳細介紹
下面小編就為大家帶來一篇老生常談Java String字串(必看篇)。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
Java中字串物件建立有兩種形式,一種是字面量形式,如String str = "hello";,另一種就是使用new這種標準的建構物件的方法,如String str = new String("hello");
對於這樣的常識,不再贅述。
首先String類別是final類,為什麼定義成final形式呢?
簡單說,對於如此高頻率被使用的資料類型,設計者們認為已經設計的足夠優秀了,不需要被繼承,否則胡亂繼承重寫可能會降低程式的性能。
如標題所述,既然深入,那我們就挖下String在jvm層面的小動作。
先解釋字面量創建的形式:
#當程式碼中出現字面量形式建立字串物件時,JVM首先會對這個字面量進行檢查,如果字串常數池中存在相同內容的字串物件的引用,則將這個引用返回,否則新的字串物件被創建,然後將這個引用放入字串常數池,並返回該引用。
如下:
String str1 = "hello" ;
當我們第一次創建的時候,這裡我們認為沒有內容為hello的物件存在。 JVM透過字串常數池查找不到內容為hello的字串物件存在,那麼會建立這個字串對象,然後將剛建立的物件的引用放入到字串常數池中,並且將引用傳回給變數str1
如果接下來有這樣一段程式碼
String str2 = "hello" ;
同樣JVM還是要偵測這個字面量,JVM透過找出字串常數池,發現內容為」hello」字串物件存在,於是將已經存在的字串物件的參考傳回給變數str2。注意這裡不會重新建立新的字串物件。
驗證是否為str1和str2是否指向同一對象,我們可以透過這段程式碼
System.out.println(str1 == str2);
結果為true。
第二個使用new建立:
String str3 = new String("hello");
當我們使用了new來建構字串物件的時候,不管字串常數池中有沒有相同內容的物件的引用,新的字串物件都會創建。因此我們使用下面程式碼測試一下,
String str3 = new String("hello"); System.out.println(str1 == str3);
結果為false。說明這兩個引用指向不同的物件。
intern
對於上面使用new建立的字串對象,如果想將這個物件的參考加入到字串常數池,可以使用intern方法。
呼叫intern後,首先檢查字串常數池中是否有該物件的引用,如果存在,則將這個引用傳回給變量,否則將引用加入並傳回給變數。
String str4 = str3.intern(); System.out.println(str4 == str1);
結果為true。
疑難問題
前提條件?
字串常數池實作的前提條件就是Java中String物件是不可變的,這樣可以安全地保證多個變數共享同一個物件。如果Java中的String物件可變的話,一個引用運算改變了物件的值,那麼其他的變數也會受到影響,顯然這樣是不合理的。
引用 or 物件
字串常數池中存放的時引用還是對象,這個問題是最常見的。字串常數池存放的是物件引用,不是物件。在Java中,物件都創建在堆疊記憶體中。字串常數池存在於堆記憶體中的永久代
優缺點
字串常數池的好處就是減少相同內容字串的創建,節省記憶體空間。
如果硬要說弊端的話,就是犧牲了CPU運算時間來換空間。 CPU計算時間主要用於在字串常數池中尋找是否有對內容相同物件的參考。不過其內部實作為HashTable,所以計算成本較低。
GC回收?
因為字串常數池中持有了共享的字串物件的引用,這就是說是不是會導致這些物件無法回收?
首先問題中共享的物件一般情況下都比較小。據我查證了解,在早期的版本中確實存在這樣的問題,但是隨著弱引用的引入,目前這個問題應該沒有了。
intern使用?
#关于使用intern的前提就是你清楚自己确实需要使用。比如,我们这里有一份上百万的记录,其中记录的某个值多次为美国加利福尼亚州,我们不想创建上百万条这样的字符串对象,我们可以使用intern只在内存中保留一份即可。
总有例外?
你知道下面的代码,会创建几个字符串对象,在字符串常量池中保存几个引用么?
String test = "a" + "b" + "c";
答案是只创建了一个对象,在常量池中也只保存一个引用。我们使用javap反编译看一下即可得知。
实际上在编译期间,已经将这三个字面量合成了一个。这样做实际上是一种优化,避免了创建多余的字符串对象,也没有发生字符串拼接问题。
以上是Java中關於String字串的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。
