成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Java字符串常量池

開發(fā)
Java字符串常量池是Java語言中一個(gè)重要而又神秘的概念。許多Java程序員對(duì)它有一定的了解,但深入理解它的工作原理和優(yōu)化技巧對(duì)于編寫高效的Java代碼至關(guān)重要。本文將帶你深入探索Java字符串常量池,從基礎(chǔ)知識(shí)到高級(jí)優(yōu)化策略,逐步揭開它的神秘面紗。

1.  new String("Hello")創(chuàng)建了幾個(gè)對(duì)象

要想了解String概念,我們先從下面面試題開始

String str = new String("Hello")

思考:上面代碼創(chuàng)建幾個(gè)對(duì)象?

琳琳不假思索回答:創(chuàng)建一個(gè)對(duì)象

我直接回答琳琳說不完全對(duì),不可能是一個(gè),也可能是兩個(gè),使用new 關(guān)鍵字創(chuàng)建字符串時(shí),Java虛擬機(jī)會(huì)在字符串常量池查找有沒Hello這個(gè)字符串。演示圖如下:

  • 如果有,就不會(huì)在字符串常量池中創(chuàng)建Hello該對(duì)象,直接在堆中創(chuàng)建一個(gè)Hello字符串,然后將堆中Hello對(duì)象地址返回賦值給變量str.如果沒有

  • 如果常量池有,先在字符串常量池中創(chuàng)建一個(gè)'Hello'的字符串對(duì)象,然后再在堆中創(chuàng)建一個(gè)'Hello'的字符串對(duì)象,然后將堆中這個(gè)'Hello'的字符串對(duì)象地址返回賦值給變量 str。

說明:棧上主要存儲(chǔ)兩類數(shù)據(jù):基本數(shù)據(jù)類型的變量和對(duì)象的引用,而對(duì)象本身則存儲(chǔ)在堆上

琳琳問我,為什么要先在字符串常量池中創(chuàng)建對(duì)象,然后再在堆上創(chuàng)建? 這樣不是多此一舉

是的,由于字符串使用頻率很高,Java虛擬機(jī)為了減少內(nèi)存開銷和提高性能,在創(chuàng)建字符串對(duì)象時(shí)候進(jìn)行了一些優(yōu)化,特意給字符串開辟一塊空間-----字符串常量池

2. 字符串常量池的作用

琳琳又問,我們平常創(chuàng)建對(duì)象采用雙引號(hào)方式創(chuàng)建字符串對(duì)象,而不是通過new 關(guān)鍵字方式創(chuàng)建

String str = "Hello"

思考:采用雙引號(hào)方式創(chuàng)建字符串對(duì)象和new 關(guān)鍵字方式創(chuàng)建區(qū)別

String str = "Hello" 時(shí),Java 虛擬機(jī)會(huì)先在字符串常量池中查找有沒有Hello這個(gè)字符串對(duì)象,

  • 如果有,則不創(chuàng)建任何對(duì)象,直接將字符串常量池中這個(gè)Hello的對(duì)象地址返回,賦給變量 str

  • 如果沒有,在字符串常量池中創(chuàng)建Hello這個(gè)對(duì)象,然后將其地址返回,賦給變量 str

Java 虛擬機(jī)創(chuàng)建了一個(gè)字符串對(duì)象 "Hello",它被添加到了字符串常量池中,同時(shí)引用變量 str 存儲(chǔ)在棧上,它指向字符串常量池中的字符串對(duì)象 "Hello"。這樣就省了一步,比之前高效了。

3. 舉例說明

String str = new String("Hello");
String str1 = new String("Hello");

思考:上面例子創(chuàng)建了幾個(gè)對(duì)象

創(chuàng)建三個(gè)對(duì)象,首先在字符串常量池創(chuàng)建一個(gè),其次堆上創(chuàng)建兩個(gè)

String str = new String("spring葵花寶典");
String str1 = new String("spring葵花寶典");

思考:雙引號(hào)創(chuàng)建字符串創(chuàng)建幾個(gè)對(duì)象

創(chuàng)建一個(gè)對(duì)象,就是字符串常量中的那個(gè)對(duì)象,這樣就提高了性能

4. 字符串常量池在內(nèi)存中位置

琳琳又問,哥,字符串常量池在內(nèi)存中的什么位置呢?

我說,你這個(gè)問題問得好

分為三個(gè)時(shí)間段

Java7之前

在Java 7之前,字符串常量池位于永久代(Permanent Generation)中,而普通的字符串對(duì)象則存儲(chǔ)在Java堆(Java Heap)中。字符串常量池用于存儲(chǔ)靜態(tài)數(shù)據(jù),包括字符串常量,而堆用于存儲(chǔ)對(duì)象實(shí)例和數(shù)組。

當(dāng)我們創(chuàng)建一個(gè)字符串常量時(shí),它會(huì)被儲(chǔ)存在永久代的字符串常量池中。如果我們創(chuàng)建一個(gè)普通字符串對(duì)象,則它將被儲(chǔ)存在堆中。如果字符串對(duì)象的內(nèi)容是一個(gè)已經(jīng)存在于字符串常量池中的字符串常量,那么這個(gè)對(duì)象會(huì)指向已經(jīng)存在的字符串常量,而不是重新創(chuàng)建一個(gè)新的字符串對(duì)象

Java7

需要注意的是,永久代的大小是有限的,并且很難準(zhǔn)確地確定一個(gè)應(yīng)用程序需要多少永久代空間。如果我們?cè)趹?yīng)用程序中使用了大量的類、方法、常量等靜態(tài)數(shù)據(jù),就有可能導(dǎo)致永久代空間不足。這種情況下,JVM 就會(huì)拋出 OutOfMemoryError 錯(cuò)誤

Java 7 開始,為了解決永久代空間不足的問題,將字符串常量池從永久代中移動(dòng)到堆中。這個(gè)改變也是為了更好地支持動(dòng)態(tài)語言的運(yùn)行時(shí)特性。

Java 8

在Java 8中,永久代(PermGen)被取消,取而代之的是元空間(Metaspace)。元空間是一塊本機(jī)內(nèi)存區(qū)域,與JVM內(nèi)存區(qū)域分開。它承擔(dān)了存儲(chǔ)類信息、方法信息、常量池信息等靜態(tài)數(shù)據(jù)的功能,與永久代的作用相似。

與永久代不同的是,元空間具有一些優(yōu)點(diǎn):

  • 動(dòng)態(tài)調(diào)整大小:元空間的大小可以動(dòng)態(tài)調(diào)整,這意味著不會(huì)因?yàn)樵臻g的大小限制而導(dǎo)致OutOfMemoryError錯(cuò)誤。
  • 使用本機(jī)內(nèi)存:元空間使用本機(jī)內(nèi)存而不是JVM堆內(nèi)存,這有助于避免堆內(nèi)存的碎片化問題,提高了內(nèi)存利用率。
  • 垃圾收集與堆分離:元空間中的垃圾收集與堆中的垃圾收集是分離的。這意味著在應(yīng)用程序運(yùn)行過程中進(jìn)行類加載和卸載時(shí),不會(huì)頻繁觸發(fā)Full GC,從而減少了系統(tǒng)資源的消耗。

總的來說,Java 8中的元空間相較于永久代帶來了更好的性能和更可靠的內(nèi)存管理。

責(zé)任編輯:華軒 來源: pringboot葵花寶典
相關(guān)推薦

2009-11-18 12:38:04

PHP字符串函數(shù)

2018-11-30 10:00:53

Python字符串編程語言

2022-12-27 08:13:40

JAVA字符串常量池

2015-11-16 10:24:45

Java常量池字符串

2015-10-27 09:41:16

Javaintern

2024-01-29 15:54:41

Java線程池公平鎖

2018-01-22 17:02:48

Python字符編碼ASCII

2024-04-01 08:41:39

字符串.NET

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2020-09-23 10:00:26

Redis數(shù)據(jù)庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發(fā)Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久精品亚洲 | 亚洲一页 | 亚洲综合无码一区二区 | 一区二区三区中文字幕 | 九七午夜剧场福利写真 | 91国产在线播放 | 欧美精品三区 | 国产精品视频在线免费观看 | 日本a v在线播放 | 美女视频h | 国产亚韩 | 欧美成人激情 | 国产精品久久久久久久久久久久久久 | 日本淫视频 | 欧美一级免费看 | 91成人精品 | 欧美日韩不卡在线 | 亚洲美女视频 | 婷婷丁香在线视频 | 国产精品国产精品 | 操久久 | 色综合网站 | 视频一区在线观看 | 日韩欧美中文在线 | 国产在线精品一区二区三区 | 久久91精品国产一区二区 | 国产成人99av超碰超爽 | 久久久久久久久中文字幕 | 久久精品久久综合 | 亚洲一区二区三区视频免费观看 | 精品美女 | 超碰国产在线 | 超碰人人爱 | 中文字幕一区二区三区精彩视频 | av黄色免费在线观看 | 天天插天天操 | 懂色一区二区三区免费观看 | 天天干视频 | 日皮视频免费 | 国产精品久久久久久久久久了 | 国产精品久久久久久久久免费软件 |