摘要:概念是一個方法,它的作用是如果字符串常量池中已經包含了一個等于此對象的字符串,則返回代表池中這個字符串的對象否則,將此對象包含的字符串添加到常量池中,并且返回此對象的引用。中,字符串常量池是放在于永久代中的,這個是完全區分于堆內存的。
概念:
String.intern()是一個native方法,它的作用是:如果字符串常量池中已經包含了一個等于此String對象的字符串,則返回代表池中這個字符串的String對象;否則,將此String對象包含的字符串添加到常量池中,并且返回此String對象的引用。
上述的黑體部分,在jdk1.6和1.7(含以上)中的表現形式是不同的。
1.jdk1.6中,字符串常量池是放在于永久代中的,這個是完全區分于堆內存的。intern()方法會把首次遇到的字符串實例復制一個到永久代中,返回的也是永久代中這個字符串實例的引用。
2.jdk1.7中,字符串常量池已經被放在了堆中,而intern()方法不會在復制實力,只是在常量池中記錄首次出現的實例引用,因此對堆內存中的String引用使用intern()方法,常量池中并不會出現對應的字符串,而是指向了堆內存中的實例。
代碼分析:
public class Test4 { public static void t1(){ //實例s1存在于堆內存中,常量池中并不存在該字符串“java” String s1 = new StringBuilder("mjp").append("cmm").toString(); //s1 intern會檢查常量池是否有“mjpcmm”,這里不存在,所以直接在常量池中記錄該引用,即s2指向了s1,所以s1==s2返回true String s2 = s1.intern(); System.out.println(s1 == s2);//這里打印出true } public static void t2(){ //先再字符串常量池中創建了mjpcmm這個常量,s保存對應常量池的引用地址 String s = "mjpcmm"; //實例s1存在于堆內存中,所以這里有兩個引用,s指向常量池,s1則指向堆內存 String s1 = new StringBuilder("mjp").append("cmm").toString(); //s1 intern會檢查常量池是否有“mjpcmm”,這里已經存在,所以直接返回該引用,即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(); } }
歡迎加入學習交流群569772982,大家一起學習交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67688.html
摘要:為了減少在中創建的字符串的數量,字符串類維護了一個字符串常量池。但是當執行了方法后,將指向字符串常量池中的那個字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因為常量池要保存的是已確定的字面量值。 String,是Java中除了基本數據類型以外,最為重要的一個類型了。很多人會認為他比較簡單。但是和String有關的面試題有很多,下面我隨便找兩道面試題,看看你能不能...
摘要:對比較返回是因為這個字符串在執之前已經出現過,字符串常量池中已經有它的引用了,不符合首次出現的原則,而計算機軟件這個字符串則是首次出現的,因此返回。 在《深入理解Java虛擬機》書中,提到在jdk1.7的版本中用String.intern()返回引用。 public class RuntimeConstantPoolOOM { public static void main(S...
摘要:證明返回常量池中已存在的對象,不等于新建的對象。為什么要設計成一下內容來自發現百度的中文版本基本也是此文的翻譯版。總之,安全性和字符串常量池緩存是被設計成不可變的主要原因。 String是Java中最常用的類,是不可變的(Immutable), 那么String是如何實現Immutable呢,String為什么要設計成不可變呢? 前言 關于String,收集一波基礎,來源標明最后,不確...
摘要:種基本類型的常量池都是系統協調的,類型的常量池比較特殊。在中,字符串常量池已經從區移到正常的區域。此時引用對象內容是,但此時常量池中是沒有對象的。這樣,首先執行聲明的時候常量池中是不存在對象的,執行完畢后,對象是聲明產生的新對象。 概覽 1. 類聲明 String 被聲明為 final,因此它不可被繼承。 在 Java 8 及之前,內部使用 char 數組存儲數據。 public fi...
摘要:所以我決定先從類入手,深入的研究一番來開個好頭。之所以會有以上的效果,是因為有字符串常量池的存在。同時運行時實例創建的全局字符串常量池中有一個表,總是為池中的每個字符串對象維護一個引用,所以這些對象不會被。 開始寫 Java 一年來,一直都是遇到什么問題再去解決,還沒有主動的深入的去學習過 Java 語言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...
閱讀 2021·2019-08-30 15:52
閱讀 2975·2019-08-29 16:09
閱讀 1323·2019-08-28 18:30
閱讀 2453·2019-08-26 12:24
閱讀 1090·2019-08-26 12:12
閱讀 2273·2019-08-26 10:45
閱讀 565·2019-08-23 17:52
閱讀 810·2019-08-23 16:03