Java常量池理論篇:Class常量池、運行時常量池、String常量池、基本類型常量池,intern方法1.6、1.7的區別

文章目錄

  • Class常量池
  • 運行時常量池
  • String常量池
  • 基本類型常量池
    • Integer 常量池
    • Long 常量池
  • 加餐部分

Class常量池

每個Class字節碼文件中包含類常量池用來存放字面量以及符號引用等信息。
在這里插入圖片描述

運行時常量池

java文件被編譯成class文件之后,也就是會生成我上面所說的 class常量池,那么運行時常量池又是什么時候產生的呢?

jvm在執行某個類的時候,必須經過加載、連接、初始化,而連接又包括驗證、準備、解析三個階段。而當類加載到內存中后,jvm就會將 class常量池 中的內容存放到 運行時常量池 中。

在上面我也說了,class常量池 中存的是字面量和符號引用,也就是說他們存的并不是對象的實例,而是對象的符號引用值。而經過解析(resolve)之后,也就是把符號引用替換為直接引用。

運行時常量池區域是在方法區中。

String常量池

在JDK1.7后String常量池的所在區域被挪至堆內存中,原位置是在運行時常量池中,而在JDK1.7后JDK在堆內開辟了一塊空間用作了String常量池。

String name="zhangsan";
String nameTwo=new String("lisi");

上述兩行代碼中“zhangsan”字面量是存儲在String常量池中,而“lisi”則是在String常量池以及堆中各有一份,使用nameTwo時獲取lisi時也是從堆中獲取。
在這里插入圖片描述

基本類型常量池

基本類型的常量池更偏向于緩存的概念,每個基本類型的包裝類都有對應的內部緩存類,若發現所需數據已完成緩存則直接從緩存對象的cache數組中獲取。整數、字符類型的最大緩存值為127而最小緩存值為-128,浮點型沒有緩存。

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

Integer 常量池

當發現所需的值小于最小緩存值并且大于最大緩存值后,則直接創建新的對象

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

Long 常量池

當發現所需的值小于最小緩存值并且大于最大緩存值后,則直接創建新的對象

public static Long valueOf(long l) {final int offset = 128;if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset];}return new Long(l);}

加餐部分

String intern方法

    String hello=new String("he")+new String("llo");String helloTwo=hello.intern();System.out.println(helloTwo==hello);

JDK1.6
在這里插入圖片描述

JDK1.6intern方法:變量hello調用intern方法,首先會去String常量池中找是否有hello這個常量,當發現未找到時則把堆中的hello對象的“hello”復制到String常量池,若發現String常量池中有“hello”時則會將常量池中的“hello”返回給helloTwo。

如上圖所示在JDK1.6的時候intern方法在調用后,發現未找到時則把堆中的hello對象的“hello”復制到String常量池。

JDK1.7在這里插入圖片描述
JDK1.7 intern方法:變量hello調用intern方法,首先會去String常量池中找是否有hello這個常量,當發現未找到時則把堆中的hello對象地址值存入到String常量池,若發現String常量池中有“hello”時則會將常量池中的“hello”返回給helloTwo。

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

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

相關文章

webshell之基于框架免殺

thinkphp array_map_recursive函數 array_map_recursive函數分析 這里存在一個call_user_func命令執行函數 免殺效果 B函數 免殺效果 B函數分析 exec函數分析 在exec函數用存在有個類調用&#xff0c;且所有的參數都可控 smarty_php_tag函數 免殺效果 smarty_php_tag函數分析…

【開源】基于Vue.js的數據可視化的智慧河南大屏

項目編號&#xff1a; S 059 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S059&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S059&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、系統展示四、核心代碼4.1 數據模塊 …

HTML新手入門筆記整理:塊元素和行內元素

塊元素 在HTML中&#xff0c;塊元素在瀏覽器顯示狀態下獨占一行&#xff0c;并且排斥其他元素與其位于一行。一般情況下&#xff0c;塊元素內部可以容納其他塊元素和行內元素。 常見塊元素 塊元素 說明 h1~h6 標題元素 p 段落元素 div div元素 hr 水平線 ol 有序列…

打印菱形-第11屆藍橋杯選拔賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第9講。 打印菱形&#xff…

周轉箱與工具柜的智能化應用

在當今制造業激烈競爭的市場中&#xff0c;6S管理方法作為提高企業競爭力的有力工具&#xff0c;與精益生產中的周轉箱和工具柜相結合&#xff0c;將為企業帶來更大的優勢。通過實施6S管理方法&#xff0c;企業不僅能夠提高生產效率、降低成本&#xff0c;還能夠改善產品質量、…

GDPU 數據結構 天碼行空11

文章目錄 數據結構實驗十一 圖的創建與存儲一、實驗目的二、實驗內容三、【實驗源代碼】&#x1f37b; CPP版&#x1f37b; c 語言版&#x1f37b; java版 四、【實驗結果】五、【實驗總結】 數據結構實驗十一 圖的創建與存儲 一、實驗目的 1、 理解圖的存儲結構與基本操作&a…

nf_conntrack內核模塊常見問題

nf_conntrack內核模塊常見問題 問題描述排查步驟前置條件&#xff1a;啟用nf_conntrack內核模塊檢查nf_conntrack配置 解決辦法1:半數減少nf_conntrack buckets的值解決辦法2:加倍調大m.min_free_kbytes值解決辦法3:Linux社區權威答復-忽略告警 問題描述 內核報錯 falling bac…

什么是 npm —— 寫給初學者的編程教程

原文鏈接&#xff1a; 什么是 npm —— 寫給初學者的編程教程 自 2009 年以來&#xff0c;Node.js 一直席卷全球。成千上萬個系統基于 Node.js 構建&#xff0c;促使開發者在社區宣稱“JavaScript 正在吞噬軟件”。 Node 成功的主要因素之一是它廣受歡迎的軟件包管理器——np…

前k個高頻單詞(C++實現)

前k個高頻單詞 題目思路代碼代碼講解 題目 思路 通過統計字符串的出現次數&#xff0c;并根據出現次數和字典序對字符串進行排序&#xff0c;找出出現頻率最高的前k個字符串。使用一個自定義的仿函數作為排序的比較函數&#xff0c;通過map容器進行統計&#xff0c;然后將結果…

Linux:strace 簡介

文章目錄 1. 前言2. 什么是 strace ?3. 使用 strace3.1 追蹤指定進程3.1.1 通過程序名追蹤進程3.1.2 通過 進程 ID (PID) 追蹤程序3.1.3 追蹤 子進程 或 線程 3.2 系統調用情況統計3.3 追蹤過濾3.3.1 追蹤指定的系統調用集合3.3.2 追蹤對指定文件句柄集合操作的系統調用3.3.3 …

前端已死?看看我的秋招上岸歷程

背景 求職方向&#xff1a;web前端 技術棧&#xff1a;vue2、springboot&#xff08;學校開過課&#xff0c;簡單的學習過&#xff09; 實習經歷&#xff1a;兩段&#xff0c;但都是實訓類的&#xff0c;說白了就是類似培訓&#xff0c;每次面試官問起時我也會坦誠交代&…

關于鴻蒙網絡請求的問題

https://developer.huawei.com/consumer/cn/forum/topic/0204136145853212268?fid0102683795438680754 鴻蒙OS 代碼 import http from ohos.net.http;export const httpUtils (url: string, data: any) > {return new Promise((resolve, reject) > {let httpRequest …

創意設計與個性化定制:酒精壁爐的獨特之處

在當今家居裝飾的潮流中&#xff0c;人們越來越注重個性化和創意&#xff0c;而酒精壁爐正是在這一趨勢中嶄露頭角。它不僅成為家居的溫馨之選&#xff0c;更因其設計的靈活性而成為創意焦點&#xff0c;吸引了越來越多注重家居設計的人群。 酒精壁爐的設計靈活性為家居注入了新…

vue的package.json詳細說明

前言 package.json 文件是一個非常重要的文件,它用于存儲關于項目的元信息以及依賴項。在 Vue.js 項目中,package.json 文件描述了項目的名稱、版本、描述、作者、依賴項、腳本命令等信息。 說明 package.json 文件常見的 詳細說明: 1.名稱 (name): 項目的名稱。遵循反向…

工作流引擎架構設計

一個應用MIS的系統的架構離不開工作流引擎&#xff0c;具有流程引擎思維的架構人員設計系統的時候就有流程的思維&#xff0c;他區別于過程思維&#xff0c;過程思維開發出來的系統&#xff0c;用戶面對的是菜單、模塊。而流程思維設計出來的系統就是發起、待辦、在途、查詢、近…

SELinux refpolicy詳解(2)

接前一篇文章:SELinux refpolicy詳解(1) 本文內容引自: Documentation SELinuxProject/refpolicy Wiki GitHub 4. 入門指南 文檔是參考策略的主要目標之一。入門指南(https://github.com/SELinuxProject/refpolicy/wiki/GettingStarted)提供了有關編寫參考策略模塊的…

關于vue3項目中 vite.config.js項目配置 多個請求地址代理配置

關于VUE3 vite.config.js文件配置相關 提示&#xff1a;本文記錄了我們項目中使用到了多個不同的接口請求前綴地址配置代理&#xff0c;如果有更好的優化方案歡迎大佬指點呀&#xff1a; 以下是我最近項目中的vite.config.js文件配置&#xff0c;由于剛開始vue3不久&#xff…

JS 類型轉換機制

這篇寫得不錯&#xff1a; 百度安全驗證 包括顯示轉換&#xff08;就是調用函數&#xff09;、隱式轉換&#xff08;運算符 - 時自動轉換成數字/字符串&#xff09; 注意到&#xff1a; abc-1 //NaN 非法字符轉換為數字 結果是NaN

LeetCode 1410. HTML 實體解析器:字符串匹配

【LetMeFly】1410.HTML 實體解析器&#xff1a;字符串匹配 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/html-entity-parser/ 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。…

【點云surface】基于多項式重建的平滑和法線估計

1 介紹 基于多項式重建的平滑和法線估計&#xff08;Smoothing and normal estimation based on polynomial reconstruction&#xff09;是一種常用的點云處理方法&#xff0c;用于平滑點云數據并估計每個點的法線信息。 該方法基于Moving Least Squares&#xff08;MLS&…