Java String.intern()
當呼叫intern方法時,如果常量池中已經存在該字串,則返回池中的字串;否則將此字串新增到常量池中,並返回字串的引用。
作用
1、重用String物件,以節省記憶體消耗。
2、多次比較字串值時,intern()後字串可以直接 == 進行比較。比equals()要快
舉個例子
class Test {
public static void main(String args[]) {
String s1 = new StringBuilder().append("String").append("Test").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder().append("ja").append("va").toString();
System.out.println(s2.intern() == s2);
}
}
1、JDK6的執行結果:false false
在JDK6中,常量池在永久代分配記憶體,永久代和Java堆的記憶體是物理隔離的,執行intern方法時,如果常量池不存在該字串,虛擬機器會在常量池中複製該字串,並返回引用,所以需要謹慎使用intern方法,避免常量池中字串過多,導致效能變慢,甚至發生PermGen記憶體溢位
2、JDK8的執行結果:true false
在JDK8中,常量池已經在Java堆上分配記憶體,執行intern方法時,如果常量池已經存在該字串,則直接返回字串引用,否則複製該字串物件的引用到常量池中並返回,所以在JDK7中,可以重新考慮使用intern方法,減少String物件所佔的記憶體空間
對於變數s1,常量池中沒有 "StringTest" 字串,s1.intern() 和 s1都是指向Java物件上的String物件。
對於變數s2,常量池中一開始就已經存在 "java" 字串(為什麼一開始就有,可以閱讀《深入理解java虛擬機器》String.intern()探究),所以 s2.intern() 返回常量池中 "java" 字串的引用。
參考文章
java中String.intern() 方法到底是幹啥的?
擴充閱讀
相關文章
- 幾張圖輕鬆理解String.intern()
- 使用String.intern減少記憶體使用記憶體
- 深入談談String.intern()在JVM的實現JVM
- 【JAVA】java使用Java
- JAVA(三)JAVA常用類庫/JAVA IOJava
- Java 解惑(Java Puzzler)Java
- Java打劫(The Java Heist)Java
- JAVA java學習(24)——————java修飾符Java
- Java 陣列、Java 日期時間、Java 正規表示式、Java 方法Java陣列
- Java 安全之Java AgentJava
- 淺析Java反射--JavaJava反射
- Java 8 + 10 = Java 18Java
- 【Java】A Guide to the Java ExecutorServiceJavaGUIIDE
- 【Java】The Java Headless ModeJava
- 【Java筆記】Java JDKJava筆記JDK
- JAVA面試題 java部分Java面試題
- java基礎-java NIOJava
- java之JAVA異常Java
- java日期 java陣列Java陣列
- Java from SUN & Son of JavaJava
- java Java與編碼Java
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- Java筆記-Java反射(二)Java筆記反射
- Java基礎類庫【Java】Java
- Java學習—java-RedisJavaRedis
- Java:Java的物件導向Java物件
- java分散式(java入門)Java分散式
- Java基礎系列—Java反射Java反射
- 《Java專欄》— 初學JavaJava
- 【java基礎】--Java列舉Java
- JAVA面試題-CORE JAVA部分Java面試題
- java "|"Java
- JavaJava
- ```javaJava
- JAVA學習筆記—JAVA WEB(二)JAVA WEB核心(下)Java筆記Web
- [JAVA] Java switch的使用細節Java
- 【Java遊戲】java俄羅斯方塊!Java遊戲
- ?Java基礎之Java列舉Java