什麼是java字符串池(java 字符串常量池在哪裡)

本文目錄一覽:

java 中string類怎麼實現

ava字符串類(java.lang.String)是Java中使用最多的類,也是最為特殊的一個類,很多時候,我們對它既熟悉又陌生。

一、從根本上認識java.lang.String類和String池

首先,我建議先看看String類的源碼實現,這是從本質上認識String類的根本出發點。從中可以看到:

1、String類是final的,不可被繼承。public final class String。

2、String類是的本質是字符數組char[], 並且其值不可改變。private final char value[];

然後打開String類的API文檔,可以發現:

3、String類對象有個特殊的創建的方式,就是直接指定比如String x = “abc”,”abc”就表示一個字符串對象。而x是”abc”對象的地址,也叫

做”abc”對象的引用。

4、String對象可以通過“+”串聯。串聯後會生成新的字符串。也可以通過concat()來串聯,這個後面會講述。

6、Java運行時會維護一個String Pool(String池),JavaDoc翻譯很模糊“字符串緩衝區”。String池用來存放運行時中產生的各種字符串,

並且池中的字符串的內容不重複。而一般對象不存在這個緩衝池,並且創建的對象僅僅存在於方法的堆棧區。

java的equals和contains的區別

java的equals和contains的區別:

1、功能不同

equals指示其他某個對象是否與此對象“相等”。

contains當且僅當此字符串包含指定的 char 值序列時,返回 true。

2、用法不同

equals實現對象上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。

contains常用與集合中判斷某個對象是否含有這個元素。

3、含義不同

equals是比較兩個東西是否等同,適用於任何類別的對象。

contains是是否包含的意思,左邊的對象是一個容器了。

4、參數不同

equals參數為obj – 要與之比較的引用對象。

contains參數為s – 要搜索的序列。

參考資料來源:百度百科——equals

百度百科——contains()

java中字符串池是存在於棧中還是存在於堆中?

1. 棧(stack)與堆(heap)都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。

2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享,詳見第3點。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。

3. Java中的數據類型有兩種。

一種是基本類型(primitive types)出於追求速度的原因,就存在於棧中。

出於追求速度的原因,就存在於棧中。

另一種是包裝類數據,如Integer, String, Double等將相應的基本數據類型包裝起來的類。這些類數據全部存在於堆中,Java用new()語句來顯示地告訴編譯器,在運行時才根據需要動態創建,因此比較靈活,但缺點是要佔用更多的時間。

4. String是一個特殊的包裝類數據。即可以用String str = new String(“abc”);的形式來創建,也可以用String str = “abc”;的形式來創建。前者是規範的類的創建過程,即在Java中,一切都是對象,而對象是類的實例,全部通過new()的形式來創建。

值得注意的是,一般String類中字符串值都是直接存值的。但像String str = “abc”;這種場合下,其字符串值卻是保存了一個指向存在棧中數據的引用!

用new()來新建對象的,都會在堆中創建,而且其字符串是單獨存值的,即使與棧中的數據相同,也不會與棧中的數據共享

使用String str = “abc”;的方式,可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對於String str = new String(“abc”);的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。

java字符串就是string嗎

ava字符串類(java.lang.String)是Java中使用最多的類,也是最為特殊的一個類,很多時候,我們對它既熟悉又陌生。

一、從根本上認識java.lang.String類和String池

首先,我建議先看看String類的源碼實現,這是從本質上認識String類的根本出發點。從中可以看到:

1、String類是final的,不可被繼承。public final class String。

2、String類是的本質是字符數組char[], 並且其值不可改變。private final char value[];

然後打開String類的API文檔,可以發現:

3、String類對象有個特殊的創建的方式,就是直接指定比如String x = “abc”,”abc”就表示一個字符串對象。而x是”abc”對象的地址,也叫

做”abc”對象的引用。

4、String對象可以通過“+”串聯。串聯後會生成新的字符串。也可以通過concat()來串聯,這個後面會講述。

6、Java運行時會維護一個String Pool(String池),JavaDoc翻譯很模糊“字符串緩衝區”。String池用來存放運行時中產生的各種字符串,

並且池中的字符串的內容不重複。而一般對象不存在這個緩衝池,並且創建的對象僅僅存在於方法的堆棧區。

5、創建字符串的方式很多,歸納起來有三類:

其一,使用new關鍵字創建字符串,比如String s1 = new String(“abc”);

其二,直接指定。比如String s2 = “abc”;

其三,使用串聯生成新的字符串。比如String s3 = “ab” + “c”;

二、String對象的創建

String對象的創建也很講究,關鍵是要明白其原理。

原理1:當使用任何方式來創建一個字符串對象s時,Java運行時(運行中JVM)會拿着這個X在String池中找是否存在內容相同的字符串對象,

如果不存在,則在池中創建一個字符串s,否則,不在池中添加。

原理2:Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。

原理3:使用直接指定或者使用純字符串串聯來創建String對象,則僅僅會檢查維護String池中的字符串,池中沒有就在池中創建一個,有則罷

了!但絕不會在堆棧區再去創建該String對象。

原理4:使用包含變量的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。

另外,String的intern()方法是一個本地方法,定義為public native String intern(); intern()方法的價值在於讓開發者能將注意力集中到

String池上。當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池

中的字符串。否則,將此 String 對象添加到池中,並且返回此 String 對象的引用。

三、不可變類

不可改變的字符串具有一個很大的優點:編譯器可以把字符串設置為共享。

不可變類String有一個重要的優點-它們不會被共享引用。

是這樣的,JAVA為了提高效率,所以對於String類型進行了特別的處理---為string類型提供了串池

定義一個string類型的變量有兩種方式:

string name= “tom “;

string name =new string( “tom “)

使用第一種方式的時候,就使用了串池,

使用第二中方式的時候,就是一種普通的聲明對象的方式

如果你使用了第一種方式,那麼當你在聲明一個內容也是 “tom “的string時,它將使用串池裡原來的那個內存,而不會重新分配內存,也就是說,string saname= “tom “,將會指向同一塊內存

另外關於string類型是不可改變的問題:

string類型是不可改變的,也就是說,當你想改變一個string對象的時候,比如name= “madding ”

那麼虛擬機不會改變原來的對象,而是生成一個新的string對象,然後讓name去指向它,如果原來的那個 “tom “沒有任何對象去引用它,虛擬機的垃圾回收機制將接收它。

據說這樣可以提高效率!!!

Java中的String類

Java運行環境有一個類似字符串池的東東。

1.

執行語句String

str=”str”時,首先查看字符串池中是否存在字符串”abc”,如果存在則直接將”abc”的引用給str,如果不存在則先在字符串池中新建一個字符串”abc”,然後再將其引用給給str。

2.

執行語句String

str

=

new

String(

“str”);

首先在String池內找,找到?不創建String對象,否則創建,

這樣就一個String對象;然後遇到new運算符號,又在內存上創建String對象,並將其返回給str,又一個對象

所以總共是2個

例:

String

s1=”str”;

String

s2=”str”;

String

s3=new

String(“str”);

String

s4=new

String(“str”);

system.out.println(s1==s2);

//

true

system.out.println(s1==s3);

//

false

system.out.println(s3==s4);

//

false

java JVM的string pool(字符串池)中存的到底是引用還是對象?

存的是對象這個毫無爭議。string pool是是在方法區開闢的空間,也是堆內存的一部分,一般引用是保存在棧上的

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/272252.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 13:55
下一篇 2024-12-17 13:55

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中將字符串轉化為浮點數

    本文將介紹在Python中將字符串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字符串轉化為…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論