本篇文章為大家帶來了關於java的相關知識,其中主要介紹了字串常數池和緩衝池的理解與作用,字串池與常數池是完全不同的兩個東西,但是很多地方都喜歡把它們混為一談,很容易讓初學者產生誤解,在這裡我想好好討論一下它們,希望對大家有幫助。
推薦學習:《java學習教學》
字串池也可以稱為字串常數池,我認為這個名稱就是產生誤解的根源,有些人說著說著就把字串三個字省略了,只剩下了常數池.. . 所以為了避免誤解,我建議在指涉字串物件的快取池的時候,就直接稱之為字串池
#1 常數池
常數池分為兩個類型,一是.class檔案中靜態的常數池,二是.class檔案中的靜態常數池被載入到JVM中而形成的運行時常數池。
1.1 靜態常數池
.class檔案中的常數池可以看作一個數組,數組中儲存了一些常數,當需要在字節碼指令中用到這個常數的時候,就透過陣列的索引來存取它。
看下面的程式碼:
String m = "hellohellohellohellohello"; String n = "hellohellohellohellohello";
它在字節碼中將會是這種形式:
// 常量池: #1 hellohellohellohellohello #2 ... ... ---------------------------- String m = #1; String n = #1;
當然,這只是一個簡化的版本,實際上要更複雜(實際的版本可以看文章末尾參考資料部分裡面貼出的那個回答,目前可以先只考慮簡化的版本)
注意,在這個裡面存儲的字符串常量只是一個簡單的UTF8編碼的位元組序列,而不是Java的字串對象,它就和你在一個txt文字中儲存的字串一樣,我們用UTF8格式來開啟一個.class文件,可以看到hellohellohellohellohello
是可以被解析的:
1.2 運行時常數池
理解了靜態的常數池之後,運行時常數池就很容易想明白了。簡單來說,執行時間常數池就是.class檔案中的靜態常數池在JVM中的執行時間表示,每一個.class檔案的靜態常數池都會產生一個對應的執行時間常數池。等到JVM在解釋String m = #1
這條指令時,它可以去這個類別的執行時間常數池中找出#1的定義。
2 字串池
字串池是Java為了重複使用String
物件而設定的快取池,Java1.7之前設定在方法區上,儲存的是String物件;Java1.7之後設定在堆上,保存的是String
物件的引用,String
物件本身存在於堆上的其他位置。下文以Java1.7之後的情況為標準。
繼續上面的例子。當JVM在解釋String m = #1時,它已經從運行時常數池拿到了對應的UTF8序列,接下來,它會在字串池中尋找和這個UTF8序列對應的String對象,並把這個對象的引用賦值給m。你可能會好奇這個String被創建的時機,根據R大的這篇文章,在這條語句所在的類別被載入時,如果字串池中已經存在對應的物件了,那麼就什麼都不做,如果不存在,就會建立一個對應的String對象,並把其引用放入池中。
除了字串池,Integer
、Long
等Wrapper類型也有自己的快取池,例如Integer
會快取從-128~127的Integer
對象,當使用字面量賦值或Integer.valueOf()
時,如果池中存在相應的對象,就會返回池中的對象,只有當池中沒有時才會在堆上建立新物件。
不過,和字串池不同的時,這些Wrapper池不會像字串池一樣可以增長,也就是池中的物件數目是固定的,Integer池中只會有-128~127 。
基本型別對應的緩衝池如下:
boolean values true and false all byte values short values between -128 and 127 int values between -128 and 127 char in the range \u0000 to \u007F
在jdk 1.8 所有的數值類別緩衝池中,Integer 的緩衝池IntegerCache 很特殊,這個緩衝池的下界是- 128,上界預設是127,但這個上界是可調的,在啟動jvm 的時候,透過-XX:AutoBoxCacheMax= 來指定這個緩衝池的大小,該選項在JVM 初始化的時候會設定一個名為java.lang .IntegerCache.high 系統屬性,然後IntegerCache 初始化的時候就會讀取該系統屬性來決定上界。
推薦學習:《java教學》
以上是深入解析JAVA中字串常數池與緩衝池理解與作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版