Java中intern()方法的使用小結
在Java中,字符串處理是日常開發(fā)的核心操作之一。而String.intern()方法作為String類的一個特殊方法,與Java的字符串常量池(String Pool)緊密相關。本文將深入剖析intern()的工作原理、使用場景和潛在陷阱,助你高效管理字符串內存。
一、字符串常量池:背景知識
Java為了優(yōu)化字符串內存占用,設計了字符串常量池(位于堆內存中)。當創(chuàng)建字符串字面量(如"hello")時,JVM會先檢查池中是否存在相同內容的字符串:
- 若存在,直接返回池中的引用;
- 若不存在,將字符串放入池中再返回引用。
這種機制避免了重復字符串的內存浪費。
二、intern()方法的作用
intern()是一個本地方法(Native Method),其行為如下:
String str1 = new String("hello"); // 在堆中創(chuàng)建新對象
String str2 = "hello"; // 使用常量池中的對象
String str3 = str1.intern(); // 將str1的內容放入常量池(若不存在)并返回池中引用
System.out.println(str1 == str2); // false(不同對象)
System.out.println(str2 == str3); // true(指向同一對象)核心邏輯:
調用intern()時,若常量池中已存在等值字符串,則返回其引用;否則將該字符串加入池中并返回引用(JDK7+的行為,詳見下文)。
三、JDK版本的關鍵差異
1. JDK6及之前
- 字符串池位于永久代(PermGen),大小有限易觸發(fā)
OutOfMemoryError。 intern()會將字符串復制到永久代。
2. JDK7+
- 字符串池移至堆內存,支持動態(tài)擴展。
intern()不再復制字符串,而是記錄堆中已有字符串的引用,節(jié)省內存。
四、典型使用場景
減少重復字符串內存占用
適用于大量重復字符串的場景(如日志處理):
List<String> strings = new ArrayList<>();
for (int i = 0; i < 100_000; i++) {
String temp = new String("重復數(shù)據(jù)").intern(); // 指向池中唯一對象
strings.add(temp);
}加速字符串比較intern()后可用==代替equals()(謹慎使用!):
String a = new String("data").intern();
String b = new String("data").intern();
System.out.println(a == b); // true到此這篇關于Java中intern()方法的使用小結的文章就介紹到這了,更多相關Java intern()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中使用LocalDate根據(jù)日期來計算年齡的實現(xiàn)方法
這篇文章主要介紹了Java中使用LocalDate根據(jù)日期來計算年齡的實現(xiàn)方法,需要的朋友可以參考下2018-01-01
詳解Java中格式化日期的DateFormat與SimpleDateFormat類
DateFormat其本身是一個抽象類,SimpleDateFormat 類是DateFormat類的子類,一般情況下來講DateFormat類很少會直接使用,而都使用SimpleDateFormat類完成,下面我們具體來看一下兩個類的用法:2016-05-05
PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式
這篇文章主要介紹了PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
SpringCloud微服務續(xù)約實現(xiàn)源碼分析詳解
這篇文章主要介紹了SpringCloud微服務續(xù)約實現(xiàn)源碼分析,服務續(xù)期和服務注冊非常相似,服務注冊在Eureka?Client程序啟動之后開啟,并同時開啟服務續(xù)期的定時任務2022-11-11

