最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java字符串常量池示例詳解

 更新時(shí)間:2021年08月04日 11:03:48   作者:FhToday  
作為最基礎(chǔ)的引用數(shù)據(jù)類型,Java設(shè)計(jì)者為 String 提供了字符串常量池以提高其性能,下面這篇文章主要給大家介紹了關(guān)于Java字符串常量池的相關(guān)資料,需要的朋友可以參考下

為什么會(huì)有常量池的概念?

不知道小伙伴們是否有思考過這個(gè)問題? 沒有思考也無所謂,小編在這里類比一下,大家就會(huì)清晰了。什么是池? 我們聽的最多的池,應(yīng)該是數(shù)據(jù)庫連接池. 為什么會(huì)有數(shù)據(jù)庫連接池,其實(shí)就是為了節(jié)省資源,提高性能,防止重復(fù)創(chuàng)建連接,避免占用內(nèi)存和網(wǎng)絡(luò)資源。

常量池其實(shí)就是跟數(shù)據(jù)庫連接池的目的都是一樣的。那么他是如何實(shí)現(xiàn)的呢? 因?yàn)槌A砍厥荍VM的概念,源碼我們也不好看,所以我們還以連接池來類比。

池化的目標(biāo)就是緩存和管理

稍微提一點(diǎn)池化的概念,其實(shí)就是對(duì)資源做一個(gè)包裝,在包裝層來加一些對(duì)這個(gè)資源的屬性信息,比如使用次數(shù),最后操作時(shí)間,最長生命周期一樣。然后通過后臺(tái)線程對(duì)資源包裝層的掃描,來對(duì)真實(shí)資源的做一個(gè)管理。Google的Guava的Cache就是這么做的,我們自己也可以利用 common-pool2 工具包自己來做,或者說池化。

Java字符串常量池

在 JDK 1.7 之前,HotSpot 虛擬機(jī)中的字符串常量池都在方法區(qū)中,用永生代實(shí)現(xiàn)。JDK 1.7 及以后的版本,字符串常量池移到了堆里。

JDK 1.6 的 String.intern 方法會(huì)將首次遇到的 String 對(duì)象復(fù)制到永久代,并返回這個(gè)對(duì)象的引用。

JDK 1.7 的 String.intern 方法不再復(fù)制,而是記錄首次出現(xiàn)的 String 對(duì)象的引用。

以下用 JDK 1.8 實(shí)驗(yàn)探究字符串常量池。

// test1
String s1 = "red";
String s2 = "red";
System.out.println(s1 == s2); // true

// test2
String s3 = new String("red");
String s4 = new String("red");
System.out.println(s3 == s4); // false

// test3
System.out.println(s1 == s3); // false

// test4
System.out.println(s3.intern() == s1); // true
System.out.println(s3.intern() == s3); // false
System.out.println(s3.intern() == s4); // false

// test5
String s5 = new String("thunder");
String s6 = s5.intern();
String s7 = "thunder";
System.out.println(s5 == s6); // false
System.out.println(s6 == s7); // true

// test6
String s8 = new String("1") + new String("1");
// String s8 = new StringBuilder().append().toString()
String s9 = s8.intern();
String s10 = "11";
System.out.println(s8 == s9); // true
System.out.println(s9 == s10); // true

常量池可以看作是一個(gè)集合,沒有重復(fù)的元素。用雙引號(hào)創(chuàng)建的對(duì)象直接放到常量池,new 一定會(huì)在堆中創(chuàng)建一個(gè)新的對(duì)象,如果常量池沒有值相同的對(duì)象那么會(huì)在常量池也創(chuàng)建一個(gè)對(duì)象。intern 的作用是判斷常量池是否包含值相同的字符串,是則返回這個(gè)字符串對(duì)象的引用,否則將當(dāng)前實(shí)例的引用放到常量池并返回當(dāng)前實(shí)例的引用。

另外,字符串的拼接實(shí)際上是用了 StringBuilder,所以字符串 s8 的創(chuàng)建會(huì)伴隨以下對(duì)象的創(chuàng)建:

  • 堆中兩個(gè)不同的 String 對(duì)象 1
  • 字符串常量池中一個(gè) String 對(duì)象 1
  • 一個(gè) StringBuilder 對(duì)象
  • 堆中的 String 對(duì)象 11

由于 s8 的創(chuàng)建方式不是 new String 而是拼接,所以不會(huì)在常量池中創(chuàng)建值為“11”的對(duì)象,這也是 test5 和 test6 要對(duì)比的問題。

總結(jié)

到此這篇關(guān)于Java字符串常量池的文章就介紹到這了,更多相關(guān)Java字符串常量池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC通過RESTful結(jié)構(gòu)實(shí)現(xiàn)頁面數(shù)據(jù)交互

    SpringMVC通過RESTful結(jié)構(gòu)實(shí)現(xiàn)頁面數(shù)據(jù)交互

    RESTFUL是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì)風(fēng)格和開發(fā)方式,基于HTTP,可以使用XML格式定義或JSON格式定義。RESTFUL適用于移動(dòng)互聯(lián)網(wǎng)廠商作為業(yè)務(wù)接口的場(chǎng)景,實(shí)現(xiàn)第三方OTT調(diào)用移動(dòng)網(wǎng)絡(luò)資源的功能,動(dòng)作類型為新增、變更、刪除所調(diào)用資源
    2022-08-08
  • Spring切入點(diǎn)表達(dá)式配置過程圖解

    Spring切入點(diǎn)表達(dá)式配置過程圖解

    這篇文章主要介紹了Spring切入點(diǎn)表達(dá)式配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法

    Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法

    這篇文章主要介紹了Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法的相關(guān)資料,今天使用Eclipse 時(shí)出現(xiàn)以上錯(cuò)誤,本文說明如何更更正,需要的朋友可以參考下
    2016-11-11
  • Gradle快速安裝及入門

    Gradle快速安裝及入門

    今天小編就為大家分享一篇關(guān)于Gradle快速安裝及入門,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 三道java新手入門面試題,通往自由的道路--多線程

    三道java新手入門面試題,通往自由的道路--多線程

    這篇文章主要為大家分享了最有價(jià)值的3道多線程面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java實(shí)現(xiàn)基本排序算法的示例代碼

    Java實(shí)現(xiàn)基本排序算法的示例代碼

    排序就是將一串記錄按照其中某個(gè)或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作。本文將用Java實(shí)現(xiàn)一些基本的排序算法,感興趣的可以了解一下
    2022-07-07
  • Java使用Poi導(dǎo)出Excel表格方法實(shí)例

    Java使用Poi導(dǎo)出Excel表格方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java使用Poi導(dǎo)出Excel表格的相關(guān)資料,Java POI是一個(gè)用于操作Microsoft Office格式的Java API庫,可以使用它來導(dǎo)出Excel文件,需要的朋友可以參考下
    2023-10-10
  • IDEA中的打包Build Artifacts圖文詳解

    IDEA中的打包Build Artifacts圖文詳解

    當(dāng)項(xiàng)目開發(fā)完畢,需要對(duì)外發(fā)布時(shí),我們就會(huì)用到IDEABuild Artifacts功能,那么如果在idea中打包呢,這篇文章主要介紹了IDEA中的打包Build Artifacts詳解,需要的朋友可以參考下
    2024-03-03
  • 詳解配置spring-boot-actuator時(shí)候遇到的一些小問題

    詳解配置spring-boot-actuator時(shí)候遇到的一些小問題

    這篇文章主要介紹了詳解配置spring-boot-actuator時(shí)候遇到的一些小問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring Boot中的SpringSecurity基礎(chǔ)教程

    Spring Boot中的SpringSecurity基礎(chǔ)教程

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架。它實(shí)際上是保護(hù)基于spring的應(yīng)用程序的標(biāo)準(zhǔn)Spring Security是一個(gè)框架,側(cè)重于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán),這篇文章主要介紹了Spring Boot中的SpringSecurity學(xué)習(xí),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

法库县| 牙克石市| 甘孜县| 长武县| 扶余县| 平度市| 通城县| 页游| 专栏| 双峰县| 仲巴县| 侯马市| 泰来县| 孟州市| 六盘水市| 阿图什市| 平塘县| 绍兴市| 湖南省| 鹤山市| 吉隆县| 宁波市| 肇州县| 揭东县| 若尔盖县| 辽宁省| 太保市| 昌乐县| 铁力市| 张掖市| 谢通门县| 呼和浩特市| 黔南| 渭源县| 武宁县| 曲沃县| 青海省| 成武县| 岳阳市| 申扎县| 安仁县|