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

Java 字符串優(yōu)化:詳解 String.intern() 方法

開發(fā) 前端
不要濫用intern()方法: 雖然intern()方法可以確保所有具有相同內(nèi)容的字符串共享相同的內(nèi)存空間,但也不要隨意使用,因?yàn)樽址A砍厥怯写笮∠拗频模^多的字符串可能會(huì)導(dǎo)致性能下降。

在Java編程中,字符串是最常用的數(shù)據(jù)類型之一,但是對(duì)于字符串的操作往往需要注意內(nèi)存的使用和性能問題。本文我們將深入探討Java中的字符串優(yōu)化技術(shù),重點(diǎn)關(guān)注于String類的intern()方法,以及如何正確地使用它來優(yōu)化字符串操作

今日內(nèi)容介紹,大約花費(fèi)9分鐘

圖片圖片

昨天介紹了深入理解Java字符串常量池,介紹了String創(chuàng)建方法以及字符串常量池,今天介紹String一個(gè)方法String.intern(),大家可以看看美團(tuán)寫的美團(tuán)技術(shù)團(tuán)隊(duì)深入解析 String.intern()文章,這是精品中精品,可是大家看了之后會(huì)覺得,我要放棄學(xué)習(xí)Java,因?yàn)橛悬c(diǎn)看不懂,那么我簡化給大家講講,前提是小伙伴已經(jīng)理解昨天深入理解Java字符串常量池這篇文章一下幾點(diǎn):

  • 1.使用雙引號(hào)聲明的字符串對(duì)象會(huì)保存在字符串常量池中
  • 2.使用 new 關(guān)鍵字創(chuàng)建的字符串對(duì)象會(huì)先從字符串常量池中找,如果沒找到就創(chuàng)建一個(gè),然后再在堆中創(chuàng)建字符串對(duì)象;如果找到了,就直接在堆中創(chuàng)建字符串對(duì)象

思考:new String("spring") + new String("葵花寶典");操作如何進(jìn)行性能優(yōu)化

1.String.intern()簡介

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

如果要把上面str內(nèi)容存放到常量池,就需要使用intern()方法

注意:Java 7時(shí),字符串常量池從永久代中移動(dòng)到了堆中,但是永久代還沒有完全被移除。Java 8時(shí),永久代被徹底移除。

Java 7之前和Java 7之后,String.intern()方法在執(zhí)行時(shí)的策略發(fā)生了變化,這一變化直接影響了內(nèi)存的利用方式

  • 在Java 7之前,無論對(duì)象是否已經(jīng)存在于堆中,String.intern()方法都會(huì)在字符串常量池中創(chuàng)建一個(gè)新的對(duì)象。
  • Java 7之后,由于字符串常量池被移動(dòng)到了堆中,執(zhí)行String.intern()方法時(shí),如果堆中已經(jīng)存在了該對(duì)象,字符串常量池中就不會(huì)創(chuàng)建新的對(duì)象,而是直接保存堆中對(duì)象的引用。這一優(yōu)化節(jié)省了一部分內(nèi)存空間。

2. String.intern()舉例說明

可能小伙伴還沒有理解,那么別怕,通過以下例子進(jìn)行說明

2.1. new String("spring葵花寶典")

String str1 = new String("spring葵花寶典");
String str2= str1.intern();
System.out.println(str1 == str2);

思考:大家猜猜上面代碼結(jié)果是什么?可能小伙伴猜不出來,那么我直接來解釋一下

第一行,字符串常量池中會(huì)先創(chuàng)建一個(gè)spring葵花寶典的對(duì)象,然后堆中會(huì)再創(chuàng)建一個(gè)spring葵花寶典的對(duì)象,str1 引用的是堆中的對(duì)象。

第二行,str1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找spring葵花寶典,如果常量池中存在spring葵花寶典字符串是否存在,因?yàn)榈谝恍写a已經(jīng)在字符串常量池創(chuàng)建spring葵花寶典,所以 str2引用的是字符串常量池中的對(duì)象

圖片圖片

image

str1 和 str2 的引用地址是不同的,str1一個(gè)來自堆,str2一個(gè)來自字符串常量池,所以輸出的結(jié)果為 false。

2.2. new String("spring") + new String("葵花寶典")

String str1 = new String("spring") + new String("葵花寶典");
String str2= str1.intern();
System.out.println(str1 == str2);

思考:2.1輸出結(jié)果是false,那么2.2結(jié)果也是false?

可能小伙伴猜錯(cuò)了,代碼輸出結(jié)果為true,這是為啥?

第一行,字符串常量池中會(huì)先創(chuàng)建兩個(gè)對(duì)象spring和葵花寶典,然后堆中會(huì)再創(chuàng)建兩個(gè)匿名對(duì)象spring和葵花寶典,最后還有一個(gè)spring葵花寶典對(duì)象(一會(huì)解釋),str1 引用的是堆中spring葵花寶典對(duì)象。

第二行,str1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找spring葵花寶典對(duì)象是否存在,此時(shí)字符串常量池不存在,但是堆中存在

圖片圖片

image

字符串常量池中保存的是堆中spring葵花寶典對(duì)象的引用,也就是說,str1 和 str2 的引用地址是相同,所以輸出的結(jié)果為 true

具體步驟如下:

  • 創(chuàng)建 "spring" 字符串對(duì)象,存儲(chǔ)在字符串常量池中。
  • 創(chuàng)建 "葵花寶典" 字符串對(duì)象,存儲(chǔ)在字符串常量池中。
  • 執(zhí)行 new String("spring"),在堆上創(chuàng)建一個(gè)字符串對(duì)象,內(nèi)容為 "spring"。
  • 執(zhí)行 new String("葵花寶典"),在堆上創(chuàng)建一個(gè)字符串對(duì)象,內(nèi)容為 "葵花寶典"。
  • 執(zhí)行 new String("spring") + new String("葵花寶典"),會(huì)創(chuàng)建一個(gè) StringBuilder 對(duì)象,并將 "spring" 和 "葵花寶典" 追加到其中,然后調(diào)用 StringBuilder 對(duì)象的 toString() 方法,將其轉(zhuǎn)換為一個(gè)新的字符串對(duì)象,內(nèi)容為 "spring葵花寶典"。這個(gè)新的字符串對(duì)象存儲(chǔ)在堆上。

特別說明:編譯器遇到 + 號(hào)這個(gè)操作符的時(shí)候,會(huì)將 new String("spring") + new String("葵花寶典") 編譯代碼如下:

new StringBuilder().append("spring").append("葵花寶典").toString();

實(shí)際步驟如下:

  • 創(chuàng)建一個(gè) StringBuilder 對(duì)象。
  • StringBuilder 對(duì)象上調(diào)用 append("spring"),將 "spring" 追加到 StringBuilder 中。
  • 在 StringBuilder 對(duì)象上調(diào)用 append("葵花寶典"),將 "葵花寶典" 追加到 StringBuilder 中。
  • 在 StringBuilder 對(duì)象上調(diào)用 toString() 方法,將 StringBuilder 轉(zhuǎn)換為一個(gè)新的字符串對(duì)象,內(nèi)容為 "spring葵花寶典"

3. String.intern()使用注意事項(xiàng)

盡管String.intern()方法能夠有效地優(yōu)化字符串操作,但是在使用時(shí)需要注意以下幾點(diǎn):

  • 不要濫用intern()方法: 雖然intern()方法可以確保所有具有相同內(nèi)容的字符串共享相同的內(nèi)存空間,但也不要隨意使用,因?yàn)樽址A砍厥怯写笮∠拗频模^多的字符串可能會(huì)導(dǎo)致性能下降。
  • 注意內(nèi)存消耗: 使用intern()方法可能會(huì)增加內(nèi)存消耗,因?yàn)樗鼤?huì)將字符串對(duì)象存儲(chǔ)到常量池中,而常量池是位于堆內(nèi)存中的一部分。
責(zé)任編輯:武曉燕 來源: springboot葵花寶典
相關(guān)推薦

2015-03-24 13:28:52

Java Java Strin內(nèi)存模型

2021-04-26 20:44:59

Nacos方法String.inte

2021-05-27 08:59:09

String字符串操作

2024-01-03 08:20:05

Java字符串性能

2015-10-27 09:41:16

Javaintern

2024-04-08 10:01:33

2015-11-16 10:24:45

Java常量池字符串

2015-08-14 09:37:44

Java字符串基本運(yùn)算

2011-08-10 18:47:18

Cocoa字符串

2019-12-17 15:49:44

Java語言字符串

2024-03-07 16:12:46

Java字符串線程

2010-10-19 14:48:09

Java String

2021-11-07 07:51:01

JavaString字符串

2010-02-02 18:01:47

C++字符串替換函數(shù)

2010-07-14 12:57:59

Perl字符串

2020-10-23 07:43:31

String

2021-04-15 00:16:18

JavaString字符串

2011-08-10 11:08:32

Objective-C字符串NSString

2024-03-06 08:41:14

Python字符串格式化工具

2009-06-30 14:16:37

截取字符串
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 一区二区在线免费播放 | 中文字幕日韩欧美 | 免费午夜剧场 | 亚洲一区欧美一区 | 欧美日韩大陆 | 成年人免费网站 | 艹逼网 | 性色av一区| 久久亚洲免费 | xxxxxx国产 | 国产精品自拍啪啪 | 一区二区三区四区电影视频在线观看 | 黄网站在线播放 | 久精品久久| 成人一区av偷拍 | 免费a级毛片在线播放 | 成人3d动漫一区二区三区91 | 午夜久久久久久久久久一区二区 | 亚洲视频一区二区三区 | 精品成人免费一区二区在线播放 | 天天操 天天操 | 久久久国产精品一区 | 久久之精品 | 国产成人精品一区二区三区四区 | 国产福利在线播放麻豆 | 在线成人 | 精品少妇一区二区三区在线播放 | 国产 日韩 欧美 在线 | 亚洲欧美高清 | 亚洲一二三在线 | 一本一道久久a久久精品蜜桃 | 国产一区二区三区在线 | 午夜视频在线免费观看 | 国产精品久久久乱弄 | 97色在线视频 | 国产成人免费视频 | 色婷婷综合久久久中字幕精品久久 | 国产亚洲精品成人av久久ww | 日韩精品一区二区三区中文在线 | 日韩av一区二区在线观看 | 97国产精品|