JVM 之 String 引用機制解析:常量池、堆內存與 intern 方法

關于常量池中的String類型的數據,在JDK6中只可能是對象,在JDK7中既可以是對象也可以是引用

案例一:

String s1 = new String("1");
String s2 = "1";
System.out.println(s1 == s2);
  • s1: 執行 new String("1"),JVM 首先在字符串常量池中查找或添加字面量 "1",然后在堆內存中新建一個內容為 "1"String 對象。s1 指向的是這個堆對象。
  • s2: 指向字符串常量池中已有的 "1"
  • 結果: s1 == s2 比較的是引用地址,一個在堆中、一個在常量池中,因此結果為 false

案例二:

String s1 = new String("1") + new String("1");
String s2 = "11";
System.out.println(s1 == s2);
  • s1: 通過兩個 new String("1") 創建兩個堆中對象,然后使用 StringBuilder 進行拼接,最終生成了一個新的 "11" 字符串對象,存放在堆內存中
  • s2: "11" 是字面量,編譯器會將其放入字符串常量池,并由 s2 指向。
  • 結果: s1 指向堆中的 "11" 對象,s2 指向常量池中的 "11",引用不同,結果為 false

案例三:

String s1 = new String("1") + new String("1");
String s2 = s1.intern();
System.out.println(s1 == s2);
  • s1: 與案例二一樣,通過拼接在堆中創建了一個 "11"String 對象。
  • intern(): 在 JDK7+ 中,intern() 會將當前堆中的對象引用嘗試放入字符串常量池中。如果常量池中尚未存在 "11",則將該對象引用添加進去,并返回這個引用。
  • s2: 返回的是字符串常量池中的引用,而由于常量池中原本沒有 "11",此時存入的是 s1 指向的堆對象本身。
  • 結果: s1 == s2,兩者引用相同,結果為 true

JVM冷啟動時,String str = “1”

執行流程:

  • JVM 首先會去常量池中查找有沒有字面量 "1"

    • 若沒有,JVM 會在堆中創建一個字符串對象 "1",并將它的引用記錄進常量池;
    • 若已存在,JVM 直接復用已有對象的引用。
  • 局部變量 str 會從常量池中取出引用,指向對應的字符串對象。

所以即使沒有顯式地寫 newJVM 也可能創建對象,但前提是該字面量還未進入常量池。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77634.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫管理-第313期 分布式挑戰單機,OceanBase單機版試玩(20250411)

數據庫管理313期 2025-04-11 數據庫管理-第313期 分布式挑戰單機,OceanBase單機版試玩(20250411)1 環境說明2 操作系統配置2.1 關閉防火墻2.2 關閉SELinux2.3 配置hosts文件2.4 配置本地yum源2.5 配置sysctl.conf2.6 配置limits.conf2.7 創建…

AI 之 LLM(大語言模型)是如何生成文本的!

你是不是也曾在朋友面前自信滿滿地說:“AI我可太熟了!”然后隨便丟一句“寫篇短文”給大模型,坐等它秒出結果?但你有沒有想過,那幾秒鐘里,AI到底干了什么?從你敲下的幾個字,到屏幕上…

STL之序列式容器(Vector/Deque/List)

序列式容器 序列式容器包括:靜態數組 array 、動態數組 vector 、雙端隊列 deque 、單鏈表 forward_ list 、雙鏈表 list 。這五個容器中,我們需要講解三個 vector 、 deque 、 list 的使 用,包括:初始化、遍歷、尾部插入與刪除、…

swift菜鳥教程6-10(運算符,條件,循環,字符串,字符)

一個樸實無華的目錄 今日學習內容:1.Swift 運算符算術運算符比較運算符邏輯運算符位運算符賦值運算區間運算符其他運算符 2.Swift 條件語句3.Swift 循環4.Swift 字符串字符串屬性 isEmpty字符串常量let 變量var字符串中插入值字符串連接字符串長度 String.count使用…

泛微ECOLOGY9 記 數據展現集成 自定義開窗測試中對SQL 的IN語法轉換存在BUG

背景 搭建流程時,需將明細表1中的合同字段 供明細表2中的合同開窗查詢使用。 最終實現如下圖: 選擇 發票號時,自動帶出明細表1中的采購合同號清單,然后在明細表2中開窗采購合同號時,只跳出明細表1中有的采購合同號&am…

(自用)藍橋杯準備(需要寫的基礎)

要寫的文件 led_app lcd_app key_app adc_app usart_app scheduler LHF_SYS一、外設引腳配置 1. 按鍵引腳 按鍵引腳配置如下: B1:PB0B2:PB1B3:PB2B4:PA0 2. LCD引腳 LCD引腳配置如下: GPIO_Pin_9 /* …

PM2 完全指南:Node.js 應用后臺啟動、關閉與重啟詳解

文章目錄 **PM2 完全指南:Node.js 應用后臺啟動、關閉與重啟詳解****1. 什么是 PM2?****2. 安裝 PM2****全局安裝****驗證安裝** **3. 使用 PM2 啟動 Node.js 應用****基本啟動****指定應用名稱****集群模式(多進程負載均衡)****監…

Linux環境變量詳解

引言 在Linux系統中,環境變量是一種非常重要的概念,它影響著系統的運行方式和應用程序的行為。無論你是Linux新手還是經驗豐富的管理員,深入理解環境變量都能幫助你更高效地使用和管理Linux系統。本文將從基礎概念到高級應用,全面…

408 計算機網絡 知識點記憶(8)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容,系統梳理核心知識記憶點和框架,既為個人復習沉淀思考,亦希望能與同行者互助共進。(PS:后續將持續迭代優化細節) 往期內容 408 計算機網絡 知識…

@linux系統SSL證書轉換(Openssl轉換PFX)

在Linux中,你可以使用OpenSSL工具將PFX/P12格式的證書轉換為單獨的CRT(證書)、KEY(私鑰)文件以及提取證書鏈 1. 提取私鑰文件(.key) openssl pkcs12 -in your_certificate.pfx -nocerts -out private.key -nodes系統會…

DAOS系統架構-組件

如上圖所示,一個完整的DAOS系統是由管理節點組件、客戶端節點組件、服務端節點組件以及網絡通信組件四個部分組成。管理節點組件通過管理網絡通道(藍色)對DAOS服務管理和監控。客戶端節點組件通過數據網絡通道(紅色)與…

制作一款打飛機游戲教程2:背景滾動

滾動原型開發 接下來,我們開始聚焦滾動原型的開發。我們需要確定游戲關卡的長度以及背景滾動的速度。 地圖與精靈空間限制 在開發過程中,我們遇到了地圖與精靈空間限制的問題。PICO 8的地圖編輯器下半部分與精靈表共享空間,這意味著我們只…

計算機組成原理——CPU與存儲器連接例題

計算機組成原理——CPU與存儲器連接例題 設CPU共有16根地址線和8根數據線,并用(MREQ) ?作為訪存控制信號(低電平有效),(WR) ?作為讀/寫命令信號(高電平讀,低電平寫)。現有下列存儲芯片&#…

GNSS靜態數據處理

1 安裝數據處理軟件:儀器之星(InStar )和 Trimble Business Center 做完控制點靜態后,我們需要下載GNSS數據,對靜態數據進行處理。在處理之前需要將相關軟件在自己電腦上安裝好: 儀器之星(InS…

Process Explorer 性能調優實戰:精準定位資源泄漏與高負載進程

一、下載與安裝 ?下載地址? Process Explorer安裝包下載:https://pan.quark.cn/s/950c36ba5364下載后解壓壓縮包,運行 procexp.exe(32 位系統)或 procexp64.exe(64 位系統)?。 ?界面概覽? 主界面以樹…

SVMSPro分布式綜合安防管理平臺-->以S3存儲革新,開啟智能安防新紀元

SVMSPro分布式綜合安防管理平臺–>以S3存儲革新,開啟智能安防新紀元 在數字化轉型浪潮下,企業安防管理正面臨海量數據存儲、跨區域協同以及數據安全的嚴峻挑戰。如何實現高效、彈性、低成本的存儲擴容?如何確保關鍵錄像數據萬無一失&…

Python 裝飾器(Decorator)

文章目錄 代碼解析1. 裝飾器定義 timer(func)2. 應用裝飾器 timer **執行流程****關鍵點****實際應用場景****改進版本(帶 functools.wraps)** 這是一個 Python 裝飾器(Decorator) 的示例,用于測量函數的執行時間。下…

git commit時自動生成Change-ID

創建全局鉤子目錄: 創建一個全局的Git hooks目錄: mkdir -p ~/.githooks 下載并設置commit-msg鉤子腳本: 下載Gerrit的commit-msg鉤子腳本,并放置在全局鉤子目錄中(如下載不了,可從本頁面附件中下載,“…

最新Ktransformers v0.24(Docker)并發部署DeepSeek-V3-0324模型

一、介紹 KTransformers v0.2.4 發布說明 我們非常高興地宣布,期待已久的 KTransformers v0.2.4 現已正式發布!在這個版本中,我們對整 體架構進行了重大重構,更新了超過 1 萬行代碼,為社區帶來了備受期待的多并發支…

飛牛私有云5大硬核功能實測!

📸 1. 智能相冊:AI搜圖原圖自由 - 自動備份:手機照片/視頻實時同步,支持RAW格式、實況照片無損備份,釋放128G手機秒變256G。 - AI黑科技: - 人臉識別:自動歸類人物相冊,輸入「媽媽…