摘要:概念是一個(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
摘要:為了減少在中創(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)的面試題有很多,下面我隨便找兩道面試題,看看你能不能...
摘要:對(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...
摘要:證明返回常量池中已存在的對(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)明最后,不確...
摘要:種基本類型的常量池都是系統(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...
摘要:所以我決定先從類入手,深入的研究一番來(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吃飯,還是得花些心思在上...
閱讀 2026·2019-08-30 15:52
閱讀 2987·2019-08-29 16:09
閱讀 1333·2019-08-28 18:30
閱讀 2461·2019-08-26 12:24
閱讀 1107·2019-08-26 12:12
閱讀 2281·2019-08-26 10:45
閱讀 578·2019-08-23 17:52
閱讀 837·2019-08-23 16:03