色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術(shù)干貨  > String字符串常量池和intern方法

String字符串常量池和intern方法

來源:千鋒教育
發(fā)布人:zyh
時間: 2023-06-13 17:50:00 1686649800

  全文大約【2300】字,不說廢話,只講可以讓你學到技術(shù)、明白原理的純干貨!本文帶有豐富的案例及配圖視頻,讓你更好地理解和運用文中的技術(shù)概念,并可以給你帶來具有足夠啟迪的思考......

String字符串常量池和intern方法

  一. 常量池簡介

  1.基本概念

  常量池是堆中的一塊存儲區(qū)域,用于存儲顯式的String、float、Integer等數(shù)據(jù)。這是一個特殊的共享區(qū)域,開發(fā)時不需要在內(nèi)存中經(jīng)常改變的數(shù)據(jù),都可以放在這里進行共享。JDK 7及其之前的常量池是在方法區(qū)中,從Java8之后,常量池存放到了堆中。

  為了讓大家更好地理解常量池的作用,壹哥給大家分析一下String字符串的內(nèi)存分配。

  2.實驗案例

  我們先來編寫一行代碼,如下所示: 

//String對象創(chuàng)建
String s = new String("xyz");

  這個代碼很簡單,就一行代碼!那么問題來了,這行代碼中幾個對象的內(nèi)存分配是如何的?接下來壹哥就給大家把這段代碼的內(nèi)存分區(qū)繪制一下(本案例開發(fā)環(huán)境是基于JDK8)。

  3. 內(nèi)存分配(重點)

  在 String s = new String("xyz"); 這行代碼中,s是String類型的變量,不是對象!‘xyz’是字符串對象,new String("xyz")也是一個對象,那么它們幾個的內(nèi)存劃分在JDK8的環(huán)境中,如下圖所示:

1683284545263.image

      根據(jù)上圖,壹哥給大家分析一下上述代碼的內(nèi)存分配情況,如下所示:

  1.當JVM在編譯階段加載讀取到“xyz”的時候,首先會檢查堆中的String常量池,也就是常量緩沖區(qū)。檢查是否已經(jīng)有了"xyz"常量對象,如果有,則不會再次創(chuàng)建"xyz"常量對象,并直接返回該字符串的引用地址;如果沒有,則創(chuàng)建一個"xyz"常量對象,并為該對象分配一個內(nèi)存地址002返回;

  2.當JVM在運行階段加載讀取到new關(guān)鍵字的時候,JVM會在堆中為其創(chuàng)建一個對象,即new String(),并為其分配內(nèi)存地址001,而堆中這個對象的內(nèi)容是上面"xyz"常量對象的引用地址002,換句話說這個堆中存的就是常量池中"xyz"的引用地址002;

  最后,s 是對當前堆中001號對象的一個地址引用,s本身不是一個對象,s只是一個String類型的變量而已!

  二. intern()方法(重點)

  了解了常量池的內(nèi)容之后,接下來請大家再跟著壹哥來看看String的intern()方法,這個方法很重要,請大家記住哦。 

/**
* Returns a canonical representation for the string object.
* <p>
* A pool of strings, initially empty, is maintained privately by the
* class {@code String}.
* <p>
* When the intern method is invoked, if the pool already contains a
* string equal to this {@code String} object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this {@code String} object is added to the
* pool and a reference to this {@code String} object is returned.
* <p>
* It follows that for any two strings {@code s} and {@code t},
* {@code s.intern() == t.intern()} is {@code true}
* if and only if {@code s.equals(t)} is {@code true}.
* <p>
* All literal strings and string-valued constant expressions are
* interned. String literals are defined in section 3.10.5 of the
* <cite>The Java&trade; Language Specification</cite>.
*
* @return a string that has the same contents as this string, but is
* guaranteed to be from a pool of unique strings.
*/
public native String intern();

  從上面的源碼注釋中我們可以知道,intern()是由C語言實現(xiàn)的native底層方法,用于從String緩存池中獲取一個與該字符串內(nèi)容相同的字符串對象。當這個intern()方法被執(zhí)行的時候,如果緩存池中已經(jīng)有這個String內(nèi)容,則直接從這個緩存池中獲取該String內(nèi)容對象;如果緩存池中沒有這個String內(nèi)容對象,則把這個String內(nèi)容對象放到緩存池中,并返回這個字符串對象的引用?,F(xiàn)在我們知道了intern()方法的功能,但是該方法的底層原理是什么樣的呢?接下來 壹哥 給結(jié)合一段代碼案例,給各位詳細說一下:  

//常量池與堆的關(guān)系
String str1="yiyige";
String str2=new String("yiyige");
System.out.println("str1==str2的結(jié)果==> " +(str1==str2));

String str3 = str2.intern();
System.out.println("str1==str3的結(jié)果==> " +(str1==str3));

  執(zhí)行結(jié)果如下圖所示:

1683284585930.image

  intern()方法的底層原理如下(重點):

  Java專門為String類設計了一個緩存池intern pool,intern pool是在方法區(qū)中的一塊特殊存儲區(qū)域,當我們通過 String str="yiyige" 這樣的方式來構(gòu)造一個新的字符串時,String類會優(yōu)先在緩存池中查找是否已經(jīng)存在內(nèi)容相同的String對象。如果有則直接返回該對象的地址引用,如果沒有就會構(gòu)造一個新的String對象,然后放進緩存池,再返回該字符串的地址引用。因此,即使我們構(gòu)造一萬個String str = "yiyige",但實際上得到的都是同一個地址引用,這樣就避免了很多不必要的空間開銷。注意:intern池不適用new String("yiyige")的構(gòu)造形式!

  注意:

  因為字符串常量池存放位置發(fā)生了變化,String類對intern()方法也進行了一些修改:

  JDK 6 版本中執(zhí)行intern()方法時,首先會判斷字符串常量池中是否存在該字符串字面量,如果不存在則拷貝一份字符串字面量存放到常量池中,最后返回該字符串字面量的唯一引用。如果發(fā)現(xiàn)字符串常量池中已經(jīng)存在,則直接返回該字符串字面量的唯一引用。

  JDK 7 以后執(zhí)行intern()方法時,如果發(fā)現(xiàn)字符串常量池中不存在該字符串字面量,則不會再拷貝一份字面量,而是拷貝字面量對應堆中的一個地址引用,然后返回這個引用。

  現(xiàn)在我們知道了,原來當一個String對象被創(chuàng)建時,如果發(fā)現(xiàn)當前String對象已經(jīng)存在于String Pool中了,就會返回一個已存在的String對象引用而不會新建一個對象。比如以下代碼只會在常量池中創(chuàng)建一個String對象。  

String str1 = "yiyige"; 
String str2 = "yiyige";

   創(chuàng)建過程如下圖所示:

1683284610520.image

  如果一個String是可變的,當改變了A引用指向的String時,可能就會導致其他的B引用得到錯誤的值,所以Sting就被設計為不可變的。String底層主要是使用intern緩存池將字符串緩存起來,同時允許把一個String字符串的地址賦值給多個String變量來引用,這樣就可以保證多個變量安全地共享同一個對象。如果Java中的String對象可變的話,一個字符串引用的操作改變了對象的值,那么其他的變量就會受到影響。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學 138****2860 剛剛成功領(lǐng)取
王同學 131****2015 剛剛成功領(lǐng)取
張同學 133****4652 剛剛成功領(lǐng)取
李同學 135****8607 剛剛成功領(lǐng)取
楊同學 132****5667 剛剛成功領(lǐng)取
岳同學 134****6652 剛剛成功領(lǐng)取
梁同學 157****2950 剛剛成功領(lǐng)取
劉同學 189****1015 剛剛成功領(lǐng)取
張同學 155****4678 剛剛成功領(lǐng)取
鄒同學 139****2907 剛剛成功領(lǐng)取
董同學 138****2867 剛剛成功領(lǐng)取
周同學 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
成人精品电影在线观看| 色噜噜夜夜夜综合网| 日韩一区中文字幕| 午夜av一区二区| 国产精品99久久久久久宅男| 欧美三级电影精品| 日本在线观看不卡视频| 欧美性大战久久| 亚洲午夜精品一区二区三区他趣| 不卡在线观看av| 午夜精品久久久久久久久久| 日韩免费一区二区三区在线播放| 国产成人午夜精品5599| 亚洲国产一区视频| 亚洲人成在线播放网站岛国| 欧美一二三区在线观看| 色拍拍在线精品视频8848| 日日夜夜免费精品视频| 一区二区三区精品视频在线| 欧美精品一区二区三区很污很色的| 久久激情综合网| 日本精品视频一区二区三区| 国产亚洲欧美色| 高清视频一区二区| 亚洲夂夂婷婷色拍ww47| 欧美日韩精品一区二区三区四区 | 91在线精品一区二区三区| 欧美日韩一二三区| 奇米色一区二区| 欧美一a一片一级一片| 亚洲成人激情av| 精品国产一二三区| 久久精品72免费观看| 久久这里只有精品6| 精品一区二区三区在线观看| 欧美精品久久99久久在免费线 | 成人精品亚洲人成在线| 国产精品不卡一区| 欧美一三区三区四区免费在线看| 男人的天堂亚洲一区| 亚洲最新在线观看| 久久久精品黄色| 日韩欧美成人一区二区| 欧美天堂亚洲电影院在线播放| 国产精品免费观看视频| 欧美一区二区高清| 日韩一区二区在线观看视频| 91久久一区二区| 色狠狠色噜噜噜综合网| 欧美在线影院一区二区| 三级精品在线观看| 亚洲特黄一级片| 亚洲免费观看高清完整版在线 | 视频一区二区中文字幕| 亚洲午夜在线电影| 婷婷国产在线综合| 免费三级欧美电影| 极品少妇xxxx偷拍精品少妇| 国产成人8x视频一区二区| 成人午夜激情视频| 欧美视频一区二区在线观看| 欧美精品久久一区| 亚洲欧美色图小说| 奇米一区二区三区| 天堂成人国产精品一区| 国产酒店精品激情| 欧美色视频在线观看| 2023国产精品视频| 久久精品在线免费观看| 亚洲国产视频网站| 91视频精品在这里| 精品国产免费人成在线观看| 亚洲黄色性网站| 丁香婷婷综合五月| 欧美三级韩国三级日本三斤| 自拍av一区二区三区| 国产成a人无v码亚洲福利| 91超碰这里只有精品国产| 亚洲国产日韩一级| 日韩午夜激情视频| 久久狠狠亚洲综合| 久久亚洲捆绑美女| jlzzjlzz亚洲日本少妇| 亚洲美女屁股眼交| 欧美艳星brazzers| 久久超级碰视频| 久久久亚洲国产美女国产盗摄| 免费av网站大全久久| 久久久久国产一区二区三区四区| 美女免费视频一区二区| www.一区二区| 亚洲国产日韩av| 亚洲国产精品v| 欧美日韩在线播放一区| 狠狠色狠狠色综合系列| 国产精品进线69影院| 欧美午夜视频网站| 美日韩一区二区| 亚洲尤物在线视频观看| 久久只精品国产| 欧美精品九九99久久| 成人黄色在线视频| 日韩国产在线一| 一区二区三区免费在线观看| 欧美中文一区二区三区| 国产精品一区在线| 日韩国产高清在线| 日本在线播放一区二区三区| 56国语精品自产拍在线观看| 色琪琪一区二区三区亚洲区| 国产mv日韩mv欧美| 大胆亚洲人体视频| 国产成人免费av在线| 国产精品电影一区二区| 欧美午夜精品免费| 欧美日韩国产片| av一二三不卡影片| 99久久婷婷国产| 麻豆成人免费电影| 国产又粗又猛又爽又黄91精品| 日韩不卡手机在线v区| 亚洲欧美日韩国产综合在线| 亚洲三级久久久| 爽好多水快深点欧美视频| 免费观看在线综合| 成人免费三级在线| 欧美日韩激情一区二区| 日韩一区二区三区视频| 国产欧美一区二区精品仙草咪| 亚洲婷婷在线视频| 亚洲国产综合91精品麻豆| 欧美aaaaa成人免费观看视频| 国产精品一卡二卡在线观看| 国产91清纯白嫩初高中在线观看| 欧美精品成人一区二区三区四区| 色综合色狠狠综合色| 亚洲欧美在线视频| 不卡的看片网站| 国产喷白浆一区二区三区| 亚洲国产一区二区视频| 麻豆91免费观看| 欧美四级电影网| 在线91免费看| 国产无遮挡一区二区三区毛片日本| 亚洲与欧洲av电影| 欧美日韩国产首页| 午夜影院在线观看欧美| 色婷婷综合在线| 亚洲成a人片综合在线| 97精品电影院| 日本不卡123| 久久九九久精品国产免费直播| 久久国产福利国产秒拍| 欧美精品一区二区三区在线| 国产精品一区二区无线| 国产精品无遮挡| 色琪琪一区二区三区亚洲区| 亚洲mv在线观看| 久久久久久久电影| 91国产丝袜在线播放| 久久99国产精品久久99果冻传媒| 欧美日韩二区三区| 大白屁股一区二区视频| 亚洲一区二区三区在线| 91久久精品国产91性色tv| 国产剧情在线观看一区二区| 欧美成人vps| 日韩免费性生活视频播放| jvid福利写真一区二区三区| 国产精品久久久久精k8| 成人高清视频在线观看| 国产精品久久久久7777按摩| 亚洲主播在线播放| 久久免费看少妇高潮| 日韩一级成人av| 91精品国产欧美一区二区18 | 一区二区三区在线免费视频| 精品电影一区二区| 日韩久久精品一区| 欧美日韩精品一区二区三区蜜桃 | 日韩精品福利网| 一区二区三区四区乱视频| 亚洲综合免费观看高清完整版在线 | 欧美大度的电影原声| 欧美一区二区三区成人| 欧美一区二区三区在线视频| 欧美日韩亚洲国产综合| 欧美另类久久久品| 久久色.com| 夜色激情一区二区| 国产一区二区福利| 99久久99久久精品国产片果冻| 色综合视频在线观看| 欧美大片日本大片免费观看| 国产精品午夜久久| 久色婷婷小香蕉久久| 日本韩国欧美一区二区三区| 欧美一区二区三区免费大片| 全部av―极品视觉盛宴亚洲| 调教+趴+乳夹+国产+精品|