成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java String.intern()

sf190404 / 3492人閱讀

摘要:概念是一個(gè)方法,它的作用是如果字符串常量池中已經(jīng)包含了一個(gè)等于此對(duì)象的字符串,則返回代表池中這個(gè)字符串的對(duì)象否則,將此對(duì)象包含的字符串添加到常量池中,并且返回此對(duì)象的引用。中,字符串常量池是放在于永久代中的,這個(gè)是完全區(qū)分于堆內(nèi)存的。

概念:

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

上述的黑體部分,在jdk1.6和1.7(含以上)中的表現(xiàn)形式是不同的。

1.jdk1.6中,字符串常量池是放在于永久代中的,這個(gè)是完全區(qū)分于堆內(nèi)存的。intern()方法會(huì)把首次遇到的字符串實(shí)例復(fù)制一個(gè)到永久代中,返回的也是永久代中這個(gè)字符串實(shí)例的引用。

2.jdk1.7中,字符串常量池已經(jīng)被放在了堆中,而intern()方法不會(huì)在復(fù)制實(shí)力,只是在常量池中記錄首次出現(xiàn)的實(shí)例引用,因此對(duì)堆內(nèi)存中的String引用使用intern()方法,常量池中并不會(huì)出現(xiàn)對(duì)應(yīng)的字符串,而是指向了堆內(nèi)存中的實(shí)例。

代碼分析:

public class Test4 {

    public static void t1(){
        //實(shí)例s1存在于堆內(nèi)存中,常量池中并不存在該字符串“java”
        String s1 = new StringBuilder("mjp").append("cmm").toString();
        //s1 intern會(huì)檢查常量池是否有“mjpcmm”,這里不存在,所以直接在常量池中記錄該引用,即s2指向了s1,所以s1==s2返回true
        String s2 = s1.intern();
        System.out.println(s1 == s2);//這里打印出true
    }

    public static void t2(){
        //先再字符串常量池中創(chuàng)建了mjpcmm這個(gè)常量,s保存對(duì)應(yīng)常量池的引用地址
        String s = "mjpcmm";
        //實(shí)例s1存在于堆內(nèi)存中,所以這里有兩個(gè)引用,s指向常量池,s1則指向堆內(nèi)存
        String s1 = new StringBuilder("mjp").append("cmm").toString();
        //s1 intern會(huì)檢查常量池是否有“mjpcmm”,這里已經(jīng)存在,所以直接返回該引用,即s2指向了s,所以s==s2返回true,s1==s2返回false
        String s2 = s1.intern();
        System.out.println(s == s2);//這里打印出true
        System.out.println(s1 == s2);//這里打印出false
    }

    public static void main(String[] args) {
//        t1();
        t2();
    }

}

歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67688.html

相關(guān)文章

  • 我終于搞清楚了和String有關(guān)的那點(diǎn)事兒。

    摘要:為了減少在中創(chuàng)建的字符串的數(shù)量,字符串類維護(hù)了一個(gè)字符串常量池。但是當(dāng)執(zhí)行了方法后,將指向字符串常量池中的那個(gè)字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因?yàn)槌A砍匾4娴氖且汛_定的字面量值。 String,是Java中除了基本數(shù)據(jù)類型以外,最為重要的一個(gè)類型了。很多人會(huì)認(rèn)為他比較簡(jiǎn)單。但是和String有關(guān)的面試題有很多,下面我隨便找兩道面試題,看看你能不能...

    paulli3 評(píng)論0 收藏0
  • 關(guān)于String.intern()和new StringBuilder("").

    摘要:對(duì)比較返回是因?yàn)檫@個(gè)字符串在執(zhí)之前已經(jīng)出現(xiàn)過(guò),字符串常量池中已經(jīng)有它的引用了,不符合首次出現(xiàn)的原則,而計(jì)算機(jī)軟件這個(gè)字符串則是首次出現(xiàn)的,因此返回。 在《深入理解Java虛擬機(jī)》書中,提到在jdk1.7的版本中用String.intern()返回引用。 public class RuntimeConstantPoolOOM { public static void main(S...

    derek_334892 評(píng)論0 收藏0
  • String的內(nèi)存模型,為什么String被設(shè)計(jì)成不可變的

    摘要:證明返回常量池中已存在的對(duì)象,不等于新建的對(duì)象。為什么要設(shè)計(jì)成一下內(nèi)容來(lái)自發(fā)現(xiàn)百度的中文版本基本也是此文的翻譯版??傊?,安全性和字符串常量池緩存是被設(shè)計(jì)成不可變的主要原因。 String是Java中最常用的類,是不可變的(Immutable), 那么String是如何實(shí)現(xiàn)Immutable呢,String為什么要設(shè)計(jì)成不可變呢? 前言 關(guān)于String,收集一波基礎(chǔ),來(lái)源標(biāo)明最后,不確...

    vspiders 評(píng)論0 收藏0
  • Java基礎(chǔ)01-String詳解

    摘要:種基本類型的常量池都是系統(tǒng)協(xié)調(diào)的,類型的常量池比較特殊。在中,字符串常量池已經(jīng)從區(qū)移到正常的區(qū)域。此時(shí)引用對(duì)象內(nèi)容是,但此時(shí)常量池中是沒(méi)有對(duì)象的。這樣,首先執(zhí)行聲明的時(shí)候常量池中是不存在對(duì)象的,執(zhí)行完畢后,對(duì)象是聲明產(chǎn)生的新對(duì)象。 概覽 1. 類聲明 String 被聲明為 final,因此它不可被繼承。 在 Java 8 及之前,內(nèi)部使用 char 數(shù)組存儲(chǔ)數(shù)據(jù)。 public fi...

    zhongmeizhi 評(píng)論0 收藏0
  • 深入研究Java String

    摘要:所以我決定先從類入手,深入的研究一番來(lái)開(kāi)個(gè)好頭。之所以會(huì)有以上的效果,是因?yàn)橛凶址A砍氐拇嬖凇M瑫r(shí)運(yùn)行時(shí)實(shí)例創(chuàng)建的全局字符串常量池中有一個(gè)表,總是為池中的每個(gè)字符串對(duì)象維護(hù)一個(gè)引用,所以這些對(duì)象不會(huì)被。 開(kāi)始寫 Java 一年來(lái),一直都是遇到什么問(wèn)題再去解決,還沒(méi)有主動(dòng)的深入的去學(xué)習(xí)過(guò) Java 語(yǔ)言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

sf190404

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<