国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上)

這篇具有很好參考價(jià)值的文章主要介紹了【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、什么是intern?

String::intern()是一個(gè)本地方法,它的作用是如果字符串常量池中已經(jīng)包含一個(gè)等于此String對(duì)象的字符串,則返回代表池中這個(gè)字符串的String對(duì)象的引用;否則,會(huì)將此String對(duì)象包含的字符串添加到常量池中,并且返回此String對(duì)象的引用。----書上描述

已經(jīng)包含。。。可能不太好理解。我畫圖解釋
【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言
方法的執(zhí)行順序肯定是從下向上依次執(zhí)行的。
String s1 = “11”; 先去字符串常量池中查看是否已經(jīng)存在“11”,如果存在則直接返回"11"的地址,如果不存在則會(huì)在字符串常量池中創(chuàng)建“11”,然后返回創(chuàng)建好的“11”的地址。因?yàn)橹拔磩?chuàng)建過,所以該指令會(huì)先去字符串常量池中創(chuàng)建“11”,然后返回11的地址 501。
String s2 = new String(“11”); 也是先去字符串常量池中查看是否已經(jīng)存在“11”,如果有就在堆中創(chuàng)建對(duì)象,存的是字符串常量池中“11”的地址501,最后,將堆中對(duì)象的地址601返回給S2 。
String s3 = s2.intern(); intern方法會(huì)從字符串常量池中,查詢當(dāng)前s2字符串"11"是否存在,若不存在就會(huì)在字符串常量池中創(chuàng)建字符串"11"的實(shí)例, 由于s1已經(jīng)在字符串常量池中已經(jīng)創(chuàng)建了“11”,s2.intern()則返回501。

System.out.println(s1==s2);
System.out.println(s1==s3);

false
true

s1==s2 返回false是因?yàn)閟1指向的是字符串常量池中的"11"對(duì)象(501),而s2指向的是堆中存儲(chǔ)了"11"的地址的對(duì)象(601)
s1==s3 返回true 是因?yàn)閟3和s1都指向的是字符串常量池中的"11"。

對(duì)String srt = new String(“str”)與 str1 = ”str“的區(qū)別不了解的話可以看篇文章

2、經(jīng)典例題解釋

例1

//1
String s = new String("1");
//2
s.intern();//調(diào)用此方法之前,字符串常量池中已經(jīng)存在了"1".
//3
String s2 = "1";
//4
System.out.println(s==s2);
  • 執(zhí)行1,會(huì)創(chuàng)建兩個(gè)對(duì)像,在字符串常量池中創(chuàng)建一個(gè)”1“,在堆中創(chuàng)建一個(gè)String對(duì)象,并存儲(chǔ)“1”在字符串常量池中的的地址。
  • 執(zhí)行2,調(diào)用此方法之前,字符串常量池中已經(jīng)存在了"1",所以此指令什么都沒做,此時(shí)s指向堆中的對(duì)象。
  • 執(zhí)行3,由于字符串常量池中已經(jīng)存在了“1”,所以不需要再創(chuàng)建,返回“1”的地址,s2指向字符串常量池中的”1“。
  • 執(zhí)行4,由于s指向堆中對(duì)象,s2指向字符串常量池中的對(duì)象,所以打印結(jié)果是false。

這是比較簡單的例子
下面上強(qiáng)度了!?。。。?!

例2

		//1
		String s3 = new String("1")+new String("1");
		//2
        s3.intern();
        //3
        String s4 = "11";
        //4
        System.out.println(s3==s4);
  • 執(zhí)行1,會(huì)在堆中創(chuàng)建兩個(gè)存儲(chǔ)字符串”1“的地址的對(duì)象和一個(gè)字面量為”11“的String對(duì)象,在字符串常量池中創(chuàng)建一個(gè)”1“字符串實(shí)例。
    在編譯期間,在創(chuàng)建String對(duì)象之前,會(huì)先創(chuàng)建一個(gè)StringBuilder對(duì)象,后面每次在堆中創(chuàng)建完一個(gè)String對(duì)象,會(huì)對(duì)該字符串執(zhí)行LDC指令,LDC指令會(huì)先到字符串常量池中查找是否存在對(duì)應(yīng)字符串實(shí)例的引用,如果有的話,那么直接返回這個(gè)字符串實(shí)例的地址給堆中的new的String對(duì)象,如果沒有的話,會(huì)創(chuàng)建一個(gè)字符串實(shí)例,然后將其添加到字符串常量池中,之后再返回這個(gè)字符串實(shí)例對(duì)象的地址給堆中創(chuàng)建的對(duì)象。完成String對(duì)象初始化后,都會(huì)執(zhí)行StringBuilder::append()方法,將該字符串拼接到StringBuilder對(duì)象里。當(dāng)都拼接完,會(huì)執(zhí)行StringBuilder::toString()方法,返回一個(gè)在堆中新new的String對(duì)象,value為"11"。
    可以通過編譯后的字節(jié)碼文件清晰的觀察整個(gè)過程:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言
    標(biāo)注的都是剛才介紹的行為。

  • 執(zhí)行2,由于toString()方法只在堆中創(chuàng)建了一個(gè)”存儲(chǔ)11"的String對(duì)象,并沒有在字符串常量池中創(chuàng)建"11"字符串實(shí)例。按之前的說法intern應(yīng)該去字符串常量池中創(chuàng)建字符串”11“的實(shí)例,但是在JDK7中,并沒有在字符串常量池中創(chuàng)建字符串"11"的實(shí)例,由于堆中已經(jīng)存在了"11"這個(gè)String對(duì)象,那么為了節(jié)省空間,會(huì)在字符串常量池中申請(qǐng)一塊空間,存放這個(gè)String對(duì)象的地址,并返回存放的地址,也就是堆中存儲(chǔ)"11"的String對(duì)象的地址。

  • 執(zhí)行3,會(huì)去字符串常量池中查找是否存在"11",因?yàn)榈诙幸呀?jīng)在字符串常量池中,創(chuàng)建了存儲(chǔ)堆中存儲(chǔ)"11"的String對(duì)象的地址的空間,則直接返回空間里面存儲(chǔ)的堆中String對(duì)象的地址,所以s4也指向了堆中存儲(chǔ)"11"的String對(duì)象。

  • 由于s3和s4都指向堆中同一個(gè)對(duì)象,所以打印結(jié)果為true。
    如圖所示:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言
    通過debug,可以看到兩個(gè)句柄指向的地址是一樣的:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言
    打印結(jié)果:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-658439.html

例3

		//1
		String s3 = new String("1")+new String("1");
		//2
        String s4 = "11";
        //3
        s3.intern();
        //4
        System.out.println(s3==s4);
  • 第一行執(zhí)行結(jié)果與例2的第一行執(zhí)行結(jié)果一致。
  • 執(zhí)行2,由于字符串常量池中,還沒有"11",則向字符串常量池中創(chuàng)建字符串"11"的實(shí)例,并返回實(shí)例的地址。
  • 執(zhí)行3,由于字符串常量池中已經(jīng)存在"11",則不需要再創(chuàng)建,返回實(shí)例的地址,但由于沒有賦值操作,所以該行代碼沒有什么作用。
  • 此時(shí),s3指向堆中存儲(chǔ)了“11”的String對(duì)象,而s4指向的是字符串常量池中字符串為"11"的實(shí)例,所以指向的地址不同打印結(jié)果為false
    通過debug可以看到兩個(gè)句柄指向的地址是不同的:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言
    打印結(jié)果:
    【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上),jvm,java,開發(fā)語言

到了這里,關(guān)于【JVM】對(duì)String::intern()方法深入詳解(JDK7及以上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【jvm系列-08】精通String字符串底層原理和運(yùn)行機(jī)制(詳解)

    【jvm系列-08】精通String字符串底層原理和運(yùn)行機(jī)制(詳解)

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識(shí)虛擬機(jī)與java虛擬機(jī) https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運(yùn)行時(shí)私有區(qū)域之虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 https

    2023年04月17日
    瀏覽(25)
  • 深入理解JVM虛擬機(jī)第十三篇:詳解JVM中的程序計(jì)數(shù)器

    深入理解JVM虛擬機(jī)第十三篇:詳解JVM中的程序計(jì)數(shù)器

    ???? 學(xué)習(xí)交流群: ??1:這是孫哥suns給大家的福利! ??2:我們免費(fèi)分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級(jí)別的視頻資料 ????3:QQ群:583783824 ? ???? ?工作微信:BigTreeJava 拉你進(jìn)微信群,免費(fèi)領(lǐng)??! ????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????

    2024年02月08日
    瀏覽(23)
  • 深入理解JVM虛擬機(jī)第二十七篇:詳解JVM當(dāng)中InvokeDynamic字節(jié)碼指令,Java是動(dòng)態(tài)類型語言么?

    深入理解JVM虛擬機(jī)第二十七篇:詳解JVM當(dāng)中InvokeDynamic字節(jié)碼指令,Java是動(dòng)態(tài)類型語言么?

    ????? 學(xué)習(xí)交流群: ??1:這是孫哥suns給大家的福利! ?? 2:我們免費(fèi)分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級(jí)別的視頻資料 ????3:QQ群: 583783824 ? ???? ?工作微信: BigTreeJava 拉你進(jìn)微信群,免費(fèi)領(lǐng)??! ????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????

    2024年02月04日
    瀏覽(21)
  • Java JVM 堆、棧、方法區(qū)詳解

    Java JVM 堆、棧、方法區(qū)詳解

    目錄 1. 棧 2. 堆 3. 方法區(qū) 4. 本地方法棧 5. 程序計(jì)數(shù)器 首先來看一下JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)有哪些。 在介紹JVM棧之前,先了解一下? 棧幀 ?概念。 棧幀:一個(gè)棧幀隨著一個(gè)方法的調(diào)用開始而創(chuàng)建,這個(gè)方法調(diào)用完成而銷毀。棧幀內(nèi)存放者方法中的局部變量,操作數(shù)棧等數(shù)據(jù)。 Jav

    2024年01月19日
    瀏覽(34)
  • JVM中方法區(qū)、永久代、元空間詳解以及關(guān)系?

    JVM中方法區(qū)、永久代、元空間詳解以及關(guān)系?

    首先我們需要先復(fù)習(xí)一下jvm的大致內(nèi)存圖,如下: 哦~ ,想起來了,原來方法區(qū)屬于jvm的運(yùn)行時(shí)數(shù)據(jù)區(qū),且作用就是存儲(chǔ)類信息、方法信息、常量池信息等靜態(tài)數(shù)據(jù)。 ?(補(bǔ)充一下:運(yùn)行時(shí)數(shù)據(jù)區(qū)中的紅色是指方法區(qū)和堆是線程共享的,其他幾個(gè)都是線程私有的) 好的,回想

    2024年02月09日
    瀏覽(19)
  • JDK JRE JVM

    JDK JRE JVM

    JDK是用于開發(fā)、編譯、調(diào)試和運(yùn)行Java應(yīng)用程序的軟件包,包含了Java編程語言的開發(fā)工具和Java運(yùn)行時(shí)環(huán)境。JDK包括Java編譯器(javac)、Java虛擬機(jī)(JVM)和Java類庫,提供了一套完整的工具和環(huán)境來進(jìn)行Java應(yīng)用程序的開發(fā)。 JRE是用于運(yùn)行Java程序的軟件包,包含了Java虛擬機(jī)(

    2024年02月16日
    瀏覽(28)
  • JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對(duì)象判斷方法

    JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對(duì)象判斷方法

    當(dāng)需要排查各種內(nèi)存溢出問題、當(dāng)垃圾收集成為系統(tǒng)達(dá)到更高并發(fā)的瓶頸時(shí),我們就需要對(duì)這些“自動(dòng)化”的技術(shù)實(shí)施必要的監(jiān)控和調(diào)節(jié)。 Java 的自動(dòng)內(nèi)存管理主要是針對(duì)對(duì)象內(nèi)存的回收和對(duì)象內(nèi)存的分配。同時(shí),Java 自動(dòng)內(nèi)存管理最核心的功能是 堆 內(nèi)存中對(duì)象的分配與回收

    2023年04月19日
    瀏覽(40)
  • 003 JDK、JRE、JVM

    003 JDK、JRE、JVM

    JDK的全稱是Java Development Kit, 它是Java程序開發(fā)工具包,包含了JRE和編譯器等開發(fā)工具。 JRE的全稱是 Java Runtime Environment,它是Java程序的運(yùn)行時(shí)環(huán)境,包含了JVM和運(yùn)行時(shí)所需要的類庫。 JVM的全稱是Java Virtual Machine,它是Java虛擬機(jī),Java程序在此容器內(nèi)運(yùn)行,這就是區(qū)別于C/C++語

    2024年01月22日
    瀏覽(18)
  • 「 JavaSE 」String、StringTable、String.intern()詳解

    「 JavaSE 」String、StringTable、String.intern()詳解

    參考鳴謝 深入解析String#intern 美團(tuán)技術(shù)團(tuán)隊(duì) 再議String-字符串常量池與String.intern() gcoder_ JVM系列之:String.intern和stringTable 程序那些事 看了這篇文章,我搞懂了StringTable robod 字符串常量池StringTable Mr_cdd Java中的字符串(String)是一種不可變對(duì)象,它在許多應(yīng)用程序中扮演著重要角

    2023年04月08日
    瀏覽(19)
  • 從JVM指令看String對(duì)象的比較

    在翻看各類 java 知識(shí)中,總會(huì)提到如下知識(shí):比較 String 對(duì)象,例如: 在剛學(xué)習(xí) java 知識(shí)的時(shí)候,對(duì)于這個(gè)結(jié)果感到非常意外且不理解,還曾一度嘗試去死記硬背。雖然網(wǎng)上的文章也有對(duì)此分析居多,但是在接觸 JVM 后,發(fā)現(xiàn)原因其實(shí)非常簡單。 在將代碼編譯成的字節(jié)碼后,

    2024年02月16日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包