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

深入理解Java字符串常量池

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

1.  new String("Hello")創建了幾個對象

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

String str = new String("Hello")

思考:上面代碼創建幾個對象?

琳琳不假思索回答:創建一個對象

我直接回答琳琳說不完全對,不可能是一個,也可能是兩個,使用new 關鍵字創建字符串時,Java虛擬機會在字符串常量池查找有沒Hello這個字符串。演示圖如下:

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

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

說明:棧上主要存儲兩類數據:基本數據類型的變量和對象的引用,而對象本身則存儲在堆上

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

是的,由于字符串使用頻率很高,Java虛擬機為了減少內存開銷和提高性能,在創建字符串對象時候進行了一些優化,特意給字符串開辟一塊空間-----字符串常量池

2. 字符串常量池的作用

琳琳又問,我們平常創建對象采用雙引號方式創建字符串對象,而不是通過new 關鍵字方式創建

String str = "Hello"

思考:采用雙引號方式創建字符串對象和new 關鍵字方式創建區別

String str = "Hello" 時,Java 虛擬機會先在字符串常量池中查找有沒有Hello這個字符串對象,

  • 如果有,則不創建任何對象,直接將字符串常量池中這個Hello的對象地址返回,賦給變量 str

  • 如果沒有,在字符串常量池中創建Hello這個對象,然后將其地址返回,賦給變量 str

Java 虛擬機創建了一個字符串對象 "Hello",它被添加到了字符串常量池中,同時引用變量 str 存儲在棧上,它指向字符串常量池中的字符串對象 "Hello"。這樣就省了一步,比之前高效了。

3. 舉例說明

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

思考:上面例子創建了幾個對象

創建三個對象,首先在字符串常量池創建一個,其次堆上創建兩個

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

思考:雙引號創建字符串創建幾個對象

創建一個對象,就是字符串常量中的那個對象,這樣就提高了性能

4. 字符串常量池在內存中位置

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

我說,你這個問題問得好

分為三個時間段

Java7之前

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

當我們創建一個字符串常量時,它會被儲存在永久代的字符串常量池中。如果我們創建一個普通字符串對象,則它將被儲存在堆中。如果字符串對象的內容是一個已經存在于字符串常量池中的字符串常量,那么這個對象會指向已經存在的字符串常量,而不是重新創建一個新的字符串對象

Java7

需要注意的是,永久代的大小是有限的,并且很難準確地確定一個應用程序需要多少永久代空間。如果我們在應用程序中使用了大量的類、方法、常量等靜態數據,就有可能導致永久代空間不足。這種情況下,JVM 就會拋出 OutOfMemoryError 錯誤

Java 7 開始,為了解決永久代空間不足的問題,將字符串常量池從永久代中移動到堆中。這個改變也是為了更好地支持動態語言的運行時特性。

Java 8

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

與永久代不同的是,元空間具有一些優點:

  • 動態調整大小:元空間的大小可以動態調整,這意味著不會因為元空間的大小限制而導致OutOfMemoryError錯誤。
  • 使用本機內存:元空間使用本機內存而不是JVM堆內存,這有助于避免堆內存的碎片化問題,提高了內存利用率。
  • 垃圾收集與堆分離:元空間中的垃圾收集與堆中的垃圾收集是分離的。這意味著在應用程序運行過程中進行類加載和卸載時,不會頻繁觸發Full GC,從而減少了系統資源的消耗。

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

責任編輯:華軒 來源: pringboot葵花寶典
相關推薦

2009-11-18 12:38:04

PHP字符串函數

2018-11-30 10:00:53

Python字符串編程語言

2022-12-27 08:13:40

JAVA字符串常量池

2015-10-27 09:41:16

Javaintern

2015-11-16 10:24:45

Java常量池字符串

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數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2020-09-23 10:00:26

Redis數據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構開發運維

2025-06-05 05:51:33

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠的干 | 天堂在线www | 北条麻妃一区二区三区在线观看 | 欧美日韩在线观看一区 | 精品亚洲一区二区三区 | 香蕉视频91| 天天干,夜夜操 | 天天影视综合 | 国产在线观看一区二区三区 | 久久久久久久久久久丰满 | 日韩精品一区二区在线 | 亚洲高清一区二区三区 | 国产1区在线| 国产精品久久久久久婷婷天堂 | 欧美一区二区在线观看 | 久久福利电影 | 91福利在线观看视频 | 在线播放中文字幕 | 五月婷婷视频 | 色狠狠一区 | 欧美一级一 | 日韩毛片免费看 | 不卡一区| 久久人体| 黄色毛片大全 | 精品日韩一区二区三区av动图 | 777zyz色资源站在线观看 | 亚洲一区三区在线观看 | 欧美一区精品 | 国产精品久久欧美久久一区 | 免费观看羞羞视频网站 | av中文字幕网 | 久久com| 久久丝袜 | 亚洲精品一区二区三区 | 国产成人a亚洲精品 | 中文字幕国产精品 | 欧美黑人巨大videos精品 | 国产一区999 | 精品一区二区三区在线观看国产 | 国产精品永久免费 |