【JAVA 字符串常量池、new String的存儲機制、==與equals的區別,以及字符串重新賦值時的指向變化】

系列文章目錄

提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加


提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 系列文章目錄
  • 代碼
    • 原理解
    • 錯誤
      • 邏輯理解理解與修正:
        • 1. 關于`str`和`str1`的創建(正確)
        • 2. 關于`str2`的創建(正確)
        • 3. 關于`str`重新賦值(正確)
        • 4. 關于“常量池字符串的刪除”(需修正)
      • 總結


代碼

public class test_locat {/*** 主方法(程序入口)** @param args 命令行參數*/public static void main(String[] args) {System.out.println("Hello, Java Template!");String str = "Hello, Java Template!";String str1 = "Hello, Java Template!";String str2 = new String("Hello, Java Template!");System.out.println(str.toString());System.out.println(str1.toString());System.out.println(str2.toString());System.out.println(str.equals(str1));System.out.println(str.equals(str2));System.out.println(str1.equals(str2));System.out.println(str == str1);System.out.println(str == str2);System.out.println(str1 == str2);str = "Hello, Java Template!?";System.out.println(str.toString());System.out.println(str == str1);System.out.println(str.equals(str1));}
}

原理解

  • str創建時是在方法區的常量池中查詢是否有這個字符串"Hello, Java Template!",沒有就在常量池中創建,并讓str指向該地址。之后的str1也是同樣的流程,只不過是常量池中有這個字符串,所以str1也指向str所指向的位置。str2是新建了一個對象在堆中,str2指向該堆的地址然后該隊指向常量池中已有的字符串的位置。在str更改值時,也在方法去常量池中查詢是否已經有字符串,然后這次沒找到,所以新建了字符串,并讓str指向該字符串。并且在這之后如果str1、str2也都改變了值,然后沒有任何對象指向該字符串,就把"Hello, Java Template!"在常量池中刪除。

錯誤

大部分是正確的,尤其是關于字符串常量池、new String的存儲機制、==equals的區別,以及字符串重新賦值時的指向變化,這些核心邏輯的理解是準確的。但有一個細節需要修正:常量池中的字符串通常不會因為沒有對象指向而被“主動刪除”,這與堆中對象的垃圾回收邏輯不同。

邏輯理解理解與修正:

1. 關于strstr1的創建(正確)
  • String str = "Hello, Java Template!":確實會先在字符串常量池(JDK 8后屬于“元空間”,邏輯上仍可理解為“方法區相關區域”)中查詢是否存在該字符串。若不存在,會在常量池創建該字符串實例,然后str指向常量池中的這個實例。
  • String str1 = "Hello, Java Template!":常量池已存在該字符串,因此str1直接指向常量池中的同一實例。
    因此str == str1true(指向同一地址),str.equals(str1)true(內容相同),與代碼輸出一致。
2. 關于str2的創建(正確)
  • String str2 = new String("Hello, Java Template!")new關鍵字會在堆中創建一個新的字符串對象str2指向堆中的這個對象;同時,堆中該對象的底層字符數據(value數組)會指向常量池中的對應字符串(避免重復存儲字符)。
    因此str == str2falsestr指向常量池,str2指向堆),但str.equals(str2)true(內容相同),與代碼輸出一致。
3. 關于str重新賦值(正確)
  • str = "Hello, Java Template!?":由于String是不可變對象(底層char[]final修飾),重新賦值時不會修改原有字符串,而是重新在常量池查詢“Hello, Java Template!?”:
    • 若不存在,在常量池創建該字符串,str轉而指向新的常量池實例;
    • str1仍指向原來的“Hello, Java Template!”(常量池中的舊實例)。
      因此str == str1變為false(指向不同地址),str.equals(str1)變為false(內容不同),與代碼輸出一致。
4. 關于“常量池字符串的刪除”(需修正)

你提到“如果str1、str2都改變值,沒有任何對象指向該字符串,就把常量池中的字符串刪除”——這一理解不準確。

字符串常量池中的字符串屬于**“運行時常量”**,其生命周期與類加載相關:

  • 常量池中的字符串通常會被JVM長期緩存,即使沒有任何引用指向它,也不會像堆中對象那樣被垃圾回收機制主動回收(除非整個類加載器被卸載,且該常量不再被任何類引用,這種情況極少發生)。
  • 堆中通過new String創建的對象(如str2指向的堆對象)若失去引用,會被垃圾回收,但這不會影響常量池中的字符串。

總結

核心理解(常量池查詢機制、new String的堆存儲、String不可變性導致的重新指向)都是正確的,唯一需要調整的是“常量池字符串的回收邏輯”——常量池中的字符串通常不會因無引用而被刪除,其生命周期遠長于堆中對象。

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

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

相關文章

博客項目 Spring + Redis + Mysql

基礎模塊1. 郵箱發送功能最初設計的接口 (雛形)public interface EmailService {/*** 發送驗證碼郵件** param email 目標郵箱* return 發送的code* throws RuntimeException 如果發送郵件失敗,將拋出異常*/String sendVerificationCode(Stri…

前端處理導出PDF。Vue導出pdf

前言:該篇主要是解決一些簡單的頁面內容導出為PDF1.安裝依賴使用到兩個依賴,項目目錄下運行這兩個//頁面轉換成圖片 npm install --save html2canvas //圖片轉換成pdf npm install jspdf --save 2.創建通用工具類exportPdf.js文件可以保存在工具類目錄下…

【GM3568JHF】FPGA+ARM異構開發板燒錄指南

1. Windows燒錄說明 SDK 提供 Windows 燒寫工具(工具版本需要 V3.31或以上),工具位于工程根目錄: tools/ ├── windows/RKDevTool 如下圖,編譯生成相應的固件后,設備燒寫需要進入 MASKROM 或 LOADER 燒寫模式,準備…

C++ 多進程編程深度解析【C++進階每日一學】

文章目錄一、引言二、核心概念:進程 (Process)功能與作用三、C 多進程的實現方式四、核心函數詳解1. fork() - 創建子進程函數原型功能說明返回值完整使用格式2. wait() 和 waitpid() - 等待子進程結束函數原型參數與返回值詳解3. exec 系列函數 - 執行新程序函數族…

一周學會Matplotlib3 Python 數據可視化-繪制面積圖(Area)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程: 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置&…

北京JAVA基礎面試30天打卡11

1.索引創建注意事項 適合的場景 1.頻繁使用where語句查詢的字段 2.關聯字段需要建立索 3.如果不創建索引,那么在連接的過程中,每個值都會進行一次全表掃描 4.分組和排序字段可以建立索引因為索引天生就是有序的,在分組和排序時優勢不言而喻 5…

vscode無法檢測到typescript環境解決辦法

有一個vitereacttypescript項目,在工作電腦上一切正常。但是,在我家里的電腦運行,始終無法檢測到typescript環境。即使出現錯誤的ts語法,也不會有報錯提示,效果如下:我故意將一個string類型,傳入…

【MCP開發】Nodejs+Typescript+pnpm+Studio搭建Mcp服務

MCP服務支持兩種協議,Studio和SSE/HTTP,目前官方提供的SDK有各種語言。 開發方式有以下幾種: 編程語言MCP命令協議發布方式PythonuvxSTUDIOpypiPython遠程調用SSE服務器部署NodejspnpmSTUDIOpnpmNodejs遠程調用SSE服務器部署… 一、初始化項…

vscode使用keil5出現變量跳轉不了和搜索全局不了

vscode使用keil5出現變量跳轉不了,或者未包含文件,或者未全局檢索; 參考如下文章后還會出現; 為什么vscode搜索欄只搜索已經打開的文件_vscode全局搜索只能搜當前文件-CSDN博客 在機緣巧合之下發現如下解決方式: 下載…

命名空間——網絡(net)

命名空間——網絡(net) 一、網絡命名空間:每個都是獨立的“網絡房間” 想象你的電腦是一棟大樓,每個網絡命名空間就是大樓里的一個“獨立房間”: 每個房間里有自己的“網線接口”(網卡)、“門牌…

一文讀懂16英寸筆記本的實際尺寸與最佳應用場景

當您搜索"16寸筆記本電腦長寬"時,內心真正在問的是什么?是背包能否容納?桌面空間是否足夠?還是期待屏幕尺寸與便攜性的完美平衡?這個看似簡單的尺寸數字背后,凝結著計算機制造商對用戶體驗的深刻…

Android Studio中創建Git分支

做一些Android項目時,有時候想要做一些實驗性的修改,這個實驗可能需要很多步驟,所以不是一時半會能完成的,這就需要在實驗的過程中不斷修改代碼,且要提交代碼,方便回滾或比較差異,但是既然是實驗…

內存可見性和偽共享問題

文章目錄什么是內存可見性問題為什么會出現可見性問題解決可見性問題的方法1. 使用volatile關鍵字2. 使用synchronized3. 使用java.util.concurrent包下的原子類什么是偽共享問題CPU緩存行偽共享的危害解決偽共享的方法1. 緩存行填充2. 使用Contended注解(JDK 8&…

Spring MVC 九大組件源碼深度剖析(三):ThemeResolver - 動態換膚的奧秘

文章目錄一、主題機制的核心價值二、核心接口設計三、四大實現類源碼解析1. FixedThemeResolver(固定主題策略)2. CookieThemeResolver(Cookie存儲策略)3. SessionThemeResolver(Session存儲策略)4. Abstra…

一、Docker本地安裝

((這里引用知乎上大佬的說法:https://www.zhihu.com/question/48174633 服務器虛擬化解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測試和部署。 一、參考帖子 Ubuntu 的 |Docker 文檔 【docker】ubuntu完全卸載docker及再次安裝_ubuntu…

LeetCode 分類刷題:2962. 統計最大元素出現至少 K 次的子數組

題目給你一個整數數組 nums 和一個 正整數 k 。請你統計有多少滿足 「 nums 中的 最大 元素」至少出現 k 次的子數組,并返回滿足這一條件的子數組的數目。子數組是數組中的一個連續元素序列。示例 1:輸入:nums [1,3,2,3,3], k 2 輸出&#…

10分鐘掌握swift

整理一個 10分鐘掌握 Swift 的精華指南,用一個 Demo 串聯 Swift 的核心語法、數據結構、函數、類/結構體和閉包,讓你快速入門。1?? 基礎語法與變量import Foundation // 引入基礎庫// 變量和常量 var name: String "Alice" // 可變 let…

【完整源碼+數據集+部署教程】食品分類與實例分割系統源碼和數據集:改進yolo11-AggregatedAttention

背景意義 研究背景與意義 隨著全球食品產業的快速發展,食品安全和質量控制日益成為社會關注的焦點。食品分類與實例分割技術的應用,能夠有效提升食品識別的準確性和效率,為食品監管、營養分析以及智能餐飲等領域提供重要支持。傳統的食品識別…

C# 中的N+1問題

目錄 含義 影響 避免方法 1. 立即加載(Eager Loading) 2. 顯式加載(Explicit Loading) 3. 投影(Projection) 4. 批處理查詢 5. 禁用延遲加載 含義 N1 問題 是 ORM(對象關系映射&#x…

國內多光譜相機做得好的廠家有哪些?-多光譜相機品牌廠家

多光譜相機是一種能夠同時捕捉多個特定波段的光譜信息,這些波段覆蓋可見光、近紅外以及短波紅外等區域。廣泛應用于遙感、農業、環境監測、工業檢測、安防等領域。近年來,我國在多光譜技術領域取得了顯著進步,涌現出一批技術實力強、產品性能…