日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String中intern的方法

發布時間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String中intern的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857513.html

String中intern的方法

首先查看官方API那個的解釋:

———————————————————————————————————————

intern

public String?intern()

返回字符串對象的規范化表示形式。

一個初始時為空的字符串池,它由類 String 私有地維護。

當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(該對象由?equals(Object)?方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。

它遵循對于任何兩個字符串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern()?==?t.intern() 才為 true。

所有字面值字符串和字符串賦值常量表達式都是內部的。

返回:

一個字符串,內容與此字符串相同,但它保證來自字符串池中。

?

———————————————————————————————————————

盡管在輸出中調用intern方法并沒有什么效果,但是實際上后臺這個方法會做一系列的動作和操作。在調用”ab”.intern()方法的時候會返回”ab”,但是這個方法會首先檢查字符串池中是否有”ab”這個字符串,如果存在則返回這個字符串的引用,否則就將這個字符串添加到字符串池中,然會返回這個字符串的引用。

可以看下面一個范例:

1 String str1 = "a";
2 String str2 = "b";
3 String str3 = "ab";
4 String str4 = str1 + str2;
5 String str5 = new String("ab");
6
7 System.out.println(str5.equals(str3));
8 System.out.println(str5 == str3);
9 System.out.println(str5.intern() == str3);
10 System.out.println(str5.intern() == str4);

得到的結果:

true

false

true

false

?

為什么會得到這樣的一個結果呢?我們一步一步的分析。

第一、str5.equals(str3)這個結果為true,不用太多的解釋,因為字符串的值的內容相同。

第二、str5 == str3對比的是引用的地址是否相同,由于str5采用new String方式定義的,所以地址引用一定不相等。所以結果為false。

第三、當str5調用intern的時候,會檢查字符串池中是否含有該字符串。由于之前定義的str3已經進入字符串池中,所以會得到相同的引用。

第四,當str4 = str1 + str2后,str4的值也為”ab”,但是為什么這個結果會是false呢?先看下面代碼:

1 String a = new String("ab");
2 String b = new String("ab");
3 String c = "ab";
4 String d = "a" + "b";
5 String e = "b";
6 String f = "a" + e;
7
8 System.out.println(b.intern() == a);
9 System.out.println(b.intern() == c);
10 System.out.println(b.intern() == d);
11 System.out.println(b.intern() == f);
12 System.out.println(b.intern() == a.intern());

運行結果:

false

true

true

false

true

由運行結果可以看出來,b.intern() == a和b.intern() == c可知,采用new 創建的字符串對象不進入字符串池,并且通過b.intern() == d和b.intern() == f可知,字符串相加的時候,都是靜態字符串的結果會添加到字符串池,如果其中含有變量(如f中的e)則不會進入字符串池中。但是字符串一旦進入字符串池中,就會先查找池中有無此對象。如果有此對象,則讓對象引用指向此對象。如果無此對象,則先創建此對象,再讓對象引用指向此對象。

??? 當研究到這個地方的時候,突然想起來經常遇到的一個比較經典的Java問題,就是對比equal和==的區別,當時記得老師只是說“==”判斷的是“地址”,但是并沒說清楚什么時候會有地址相等的情況?,F在看來,在定義變量的時候賦值,如果賦值的是靜態的字符串,就會執行進入字符串池的操作,如果池中含有該字符串,則返回引用。

執行下面的代碼:

1 String a = "abc";
2 String b = "abc";
3 String c = "a" + "b" + "c";
4 String d = "a" + "bc";
5 String e = "ab" + "c";
6
7 System.out.println(a == b);
8 System.out.println(a == c);
9 System.out.println(a == d);
10 System.out.println(a == e);
11 System.out.println(c == d);
12 System.out.println(c == e);

運行的結果:

true

true

true

true

true

true

總結

以上是生活随笔為你收集整理的String中intern的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。