日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析

發布時間:2025/3/21 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 案例
    • 答案
    • 字符串常量池在不同JDK版本的位置變化
    • JDK1.7(含)+
    • JDK1.6
  • intern源碼

Pre

JVM - 深入剖析字符串常量池


案例

String str2 = new StringBuilder("計算機").append("技術").toString();System.out.println(str2 == str2.intern()); String s2 = new StringBuilder("計算機技術").toString();System.out.println(s2 == s2.intern());

讀者可以先自行推演一下答案 ,是不是所有的JDK版本都是一樣的? 還是說不同的JDK版本的答案不盡相同 ?


答案

String str2 = new StringBuilder("計算機").append("技術").toString();System.out.println(str2 == str2.intern()); //1.8 true 1.6 falseString s2 = new StringBuilder("計算機技術").toString();System.out.println(s2 == s2.intern()); //1.8 false 1.6 false

【1.6 】

【1.7 】

【1.8】


字符串常量池在不同JDK版本的位置變化

  • Jdk1.6及之前: JVM存在永久代, 運行時常量池在永久代,運行時常量池包含字符串常量池
  • Jdk1.7:有永久代,但已經逐步“去永久代”,字符串常量池從永久代里的運行時常量池分離到堆里
  • Jdk1.8及之后: 無永久代,變成了元空間,運行時常量池在元空間,字符串常量池里依然在堆里

String中的intern方法是一個 native 的方法

  • JDK1.7(含) + ,當調用 intern方法時,如果池已經包含一個等于此String對象的字符串(用equals(oject)方法確定),則返回池中的字符串, 否則,將intern返回的引用指向當前字符串 。

  • jdk1.6版本需要將 s1 復制到字符串常量池里


JDK1.7(含)+

JDK1.6

明白了哈


intern源碼

intern 在JDK里是native ,所以只能找C++的代碼了。

JDK8對應的哈

看看basic_add 返回的啥

oop : ordinary object pointer 指針

加入到常量池,這個常量池StringTable , 也是個hash結構 ,最后返回string(), 這其實是個指針引用。

so ~ , 這樣就好理解intern機制了吧 。

總結

以上是生活随笔為你收集整理的JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。