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()在JVM的實現JVM
- Java SE, Java EE, Java MEJava
- Java 解惑(Java Puzzler)Java
- 【Java】A Guide to the Java ExecutorServiceJavaGUIIDE
- 【Java】The Java Headless ModeJava
- JAVA java學習(24)——————java修飾符Java
- Java 陣列、Java 日期時間、Java 正規表示式、Java 方法Java陣列
- 【Java筆記】Java JDKJava筆記JDK
- 淺析Java反射--JavaJava反射
- Java 8 + 10 = Java 18Java
- Java 安全之Java AgentJava
- Java筆記-Java反射(二)Java筆記反射
- Java基礎類庫【Java】Java
- Java基礎系列—Java反射Java反射
- Java:Java的物件導向Java物件
- java分散式(java入門)Java分散式
- Java學習—java-RedisJavaRedis
- JAVA-java日期工具類Java
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- JAVA學習筆記—JAVA WEB(二)JAVA WEB核心(下)Java筆記Web
- JavaJava
- ```javaJava
- 《Effective Java》--Java進階必備Java
- java原始碼-java.util.ListJava原始碼
- 【Java反射】Java 泛型基礎Java反射泛型
- 【java學習】JDK(Java Development Kit)JavaJDKdev
- 【Java】Java計時器(秒錶)Java
- 【java提高】(17)---Java 位運算子Java
- ?Java基礎之Java列舉Java
- [JAVA] Java switch的使用細節Java
- Java進階--Java動態代理Java
- java,javac,java -version的區別Java
- 【Java基礎】01初識JavaJava
- java 8 - java 17 升級指北Java
- JAVA學習--JAVA基礎(一)Java
- [JAVA] 初識Java 和 Java的跨平臺實現原理Java
- Java架構-Java JDK 動態代理Java架構JDK