亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

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

String字符串常量池和intern方法

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

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

String字符串常量池和intern方法

  一. 常量池簡介

  1.基本概念

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

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

  2.實驗案例

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

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

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

  3. 內存分配(重點)

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

1683284545263.image

      根據上圖,壹哥給大家分析一下上述代碼的內存分配情況,如下所示:

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

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

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

  二. intern()方法(重點)

  了解了常量池的內容之后,接下來請大家再跟著壹哥來看看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語言實現的native底層方法,用于從String緩存池中獲取一個與該字符串內容相同的字符串對象。當這個intern()方法被執行的時候,如果緩存池中已經有這個String內容,則直接從這個緩存池中獲取該String內容對象;如果緩存池中沒有這個String內容對象,則把這個String內容對象放到緩存池中,并返回這個字符串對象的引用。現在我們知道了intern()方法的功能,但是該方法的底層原理是什么樣的呢?接下來 壹哥 給結合一段代碼案例,給各位詳細說一下:  

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

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

  執行結果如下圖所示:

1683284585930.image

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

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

  注意:

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

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

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

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

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

   創建過程如下圖所示:

1683284610520.image

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

聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
亚洲精品有码在线观看| 亚洲AⅤ永久无码精品毛片| 西西人体大胆午夜啪啪| 亚洲午夜无码久久久久软件| 中国人妻XXXXX免费看| YSL千人千色YESE88网站| 丰满岳乱妇三级高清| 黑料传送门TTTZZZ07DU| 麻花豆传媒剧国产MV在线下载 | 美女MM131爽爽爽| 日本AⅤ精品一区二区三区日| 天天躁夜夜躁狠狠是什么心态| 亚洲国产精品久久久久秋霞小 | 大波妺AV网站影院| 好男人影视在线观看下载| 免费男人下部进女人下部视频 | 女人张开腿让男人桶爽免| 少妇无码一区二区三区免费| 亚洲国产精品一区二区成人片不卡| 装醉把自己给流浪汉玩| 国产69精品久久久久9999A| 精品人妻一区二区三区视频53一| 女口述第一次放进去的感受| 未满小14洗澡无码视频网站| 一边摸一边抽搐一进一出视频| 成人黄网站高清免费视频| 韩国善良的小峓子在钱| 欧美久久高潮久久高潮| 午夜DJ在线观看免费完整版社区| 永久免费观看国产裸体美女| 丰满的继牳3中文字幕系列免费| 极品尤物爆乳自慰呻吟| 人妻丰满熟妇A无码区| 亚洲AV无码成人片在线观看 | 亚洲综合精品第一页| 成人AV无码乱码在线观看无码| 极品丰满熟妇人妻无码| 人人澡人摸人人添学生AV| 亚洲国产成人一区二区三区| WWW亚洲精品久久久| 狠狠色婷婷久久一区二区| 啪啪叉叉xx高清无码| 亚洲AV无码专区青青草原| HEYZO中文字幕无码| 黄到让你下面湿的视频| 日本最新免费二区三区| 亚洲综合小说区图片区| 国产精品宾馆在线精品酒店| 蜜臀AV永久免费看片| 午夜精品射精入后重之免费观看| 97精品伊人久久大香线蕉APP| 国产在线乱码一区二区三区| 清一区二区国产好的精华液| 亚洲日韩在线成人AV电影网站| 丰满人爽人妻AXXXXHD| 美女高潮20分钟视频在线观看| 五十路熟妇亲子交尾| 把人妻日出白浆人妻视频| 久久精品岛国AV一区二区无码 | 欧美日韩精品人妻二区| 亚洲内射少妇AV影院| 父母儿女一家换着玩的句子| 麻花传媒剧国产MV在线观看| 性丰满ⅩXXOOOZZXXHD| 别揉我奶头~嗯~啊~动漫网站| 久久久久99精品成人片牛牛影视| 无码粉嫩虎白一线天在线观看| ⅩXXⅩ互换人妻四人互换| 久99久精品免费视频热| 无码国产精品一区二区免费I6 | 岳丰满多毛的大隂户老太的介绍| 国产睡熟迷奷系列网站| 日韩内射美女片在线观看网站 | 亚洲丰满少妇多毛大隂户| 妇女性内射冈站HDWWW000| 妺妺窝人体色www人体| 亚洲卡1卡2乱码新区仙踪| 国产精品久线在线观看| 日本久久夜夜一本婷婷| 1024久久亚洲精品无码| 久久大香国产成人AV| 亚洲AV成人无码天堂| 国产JIZZJIZZ麻豆全部免| 人妻激情偷乱视频一区二区三区 | 老熟妇午夜毛片一区二区三区| 亚洲AV第一成肉网肉片AV| 丰满少妇人妻无码| 人妻少妇无码中文幕久久| 中文无码熟妇人妻AV在线| 精品综合久久久久久97超人| 性欧美18ⅩXOO极品FREE| 国产99久久久久久免费看| 人妻熟妇乱又伦精品视频APP| 中文字幕日产乱码国内自| 久久久久99精品成人品| 亚洲国产成人精品无码区在线播放| 国产精品IGAO视频| 熟妇无码乱子成人精品| 残忍开嫩苞疼哭了视频| 欧美日韩亚洲国产综合乱| 18禁黄网站男男禁片免费观看| 久久婷婷综合缴情亚洲狠狠_| 亚洲精品国产美女久久久99| 国产女人18毛片水真多| 无码久久精品国产亚洲AV影片 | 五月婷日韩中文字幕| 国产Chinese男男视频| 色综合色欲色综合色综合色综合| 把腿张开我要CAO死你在线观看| 欧美交性一级视频免费播放| 18禁止午夜福利体验区| 免费看黄A级毛片| 又粗又硬又大又爽免费视频播放| 久久久久久老熟妇人妻av| 亚洲中文字幕码在线电影| 久久WWW成人免费网站| 亚洲欧洲日产国码无码AV喷潮| 精品久久久BBBB人妻| 亚洲精品宾馆在线精品酒店| 激情综合亚洲色婷婷五月APP| 亚洲AV无一区二区三区久久| 含羞草四叶草三叶草| 亚洲第一天堂成人网站| 精品女同一区二区三区免费站| 亚洲精品无码成人片久久| 久久精品国产精品亚洲毛片| 亚洲日韩乱码中文无码蜜桃臀 | 国产老妇伦国产熟女老妇久| 无码人妻久久久一区二区三区 | 亚洲中文字幕无码人在线 | 一本大道香蕉在线资源| 久久亚洲人成网站| 中文字幕AV日韩精品一区二区| 免费直播视频在线观看| AV无码久久久久不卡网站蜜桃 | 男j插女p无遮挡100%| AV天堂东京热无码专区| 日本极品少妇XXXX| 丰满熟妇大肉唇张开| 无码视频免费一区二三区| 狠狠躁夜夜躁人人爽天天5| 亚洲日韩AV一区二区三区中文| 久久亚洲国产成人影院| 7777奇米四色成人眼影| 人妻少妇看A偷人无码电影| 东京热无码人妻系列综合网站 | 人人妻人人澡人人爽人人精品电影 | 无码人妻少妇久久中文字幕蜜桃 | 啪啪叉叉xx高清无码| 丰满白嫩大屁股ASS| 性色做爰片在线观看WW| 精品无码黑人又粗又大又长AV | 干了老婆闺蜜两个小时| 亚洲AⅤ无码日韩AV中文AV伦| 久久精品动漫一区二区三区 | 欧美又大粗又爽又黄大片视频| 成人片黄网站色多多WWW| 无码熟妇人妻Av又大又粗又爽| 国精产品一品二品国精破解| 亚洲中文字幕无码中文字| 欧美乱大交XXXXX性喷潮| 嗯~啊哈好深好骚啊哼| 亚洲AV成人无码网天堂| 久久久久久亚洲精品成人| FREEZEFRAME丰满人妻| 推拿完整版中文字幕| 久久WWW免费人成_看片| AV成人片无码夜色AV大胸| 天堂久久久久VA久久久久| 精品人无码一区二区三区| 97人澡人人添人人爽欧美| 爽到憋不住潮喷大喷水视频| 黑人与中国娇小美女AV在线| 岳好紧好紧我要进去了电影| 日本毛多水多做受视频| 国产主播AV福利精品一区| 中国少妇BBWBBW| 日韩中文人妻无码不卡| 护士高潮喷水白浆| A狠狠久久蜜臀婷色中文网| 无码一区二区三区中文字幕| 久久性色欲AV免费精品观看| 爆乳大森しずか无码| 亚洲AV毛片一区二区三区| 男人J桶进女人P无遮挡| 国产成人亚洲影院在线播放| 亚洲中文字幕久久精品无码喷水| 人妻精油按摩BD高清中文字幕| 国产无套粉嫩白浆在线观看| 中文字幕爆乳JULIA女教师| 熟女少妇a性色生活片毛片| 久久精品欧美日韩精品| 纯肉无遮挡H肉动漫在线观看网址 纯肉无遮挡H肉动漫在线观看国产 | 亚洲日韩欧洲乱码AV夜夜摸| 欧洲成人午夜精品无码区久久 | 丰满肥女巨肥BWWBBWW| 亚洲一卡一卡二新区无人区| 肉丝超薄少妇一区二区三区| 久久精品女人天堂AV免费观看| 大香伊蕉在人线国产2020年|