intern() 方法返回字符串對象的規(guī)范化表示形式谦炒。
它遵循以下規(guī)則:對于任意兩個字符串 s 和 t挫剑,當(dāng)且僅當(dāng) s.equals(t) 為 true 時去扣,s.intern() == t.intern() 才為 true。
語法
public String intern()
參數(shù)
無
返回值
一個字符串樊破,內(nèi)容與此字符串相同愉棱,但一定取自具有唯一字符串的池。
實例
public class Test {
public static void main(String args[]) {
String Str1 = new String("www.runoob.com");
String Str2 = new String("WWW.RUNOOB.COM");
System.out.print("規(guī)范表示:" );
System.out.println(Str1.intern());
System.out.print("規(guī)范表示:" );
System.out.println(Str2.intern());
}
}
以上程序執(zhí)行結(jié)果為:
規(guī)范表示:www.runoob.com
規(guī)范表示:WWW.RUNOOB.COM
盡管在輸出中調(diào)用intern方法并沒有什么效果哲戚,但是實際上后臺這個方法會做一系列的動作和操作奔滑。在調(diào)用”ab”.intern()方法的時候會返回”ab”,但是這個方法會首先檢查字符串池中是否有”ab”這個字符串顺少,如果存在則返回這個字符串的引用档押,否則就將這個字符串添加到字符串池中,然會返回這個字符串的引用祈纯。
業(yè)務(wù)場景:當(dāng)我們使用java中的synchronized關(guān)鍵字進(jìn)行并發(fā)處理的時候,我們用字符串當(dāng)鎖叼耙,例如
public void test(String str) {
synchronized (str) {
...
}
}
當(dāng)出現(xiàn)并發(fā)訪問時腕窥,這里的同步代碼塊并不能解決并發(fā)問題,因為不同請求獲取到的字符串對象是不一樣的筛婉,怎么解決呢簇爆?
public void test(String str) {
synchronized (str.intern()) {
...
}
}
intern()方法會先檢查字符串池中是否存在這個字符串癞松,如果有返回該字符串引用地址,沒有則添加到字符串池然后返回引用地址入蛆。這樣獲取到的鎖對象就是同一個對象响蓉。