Java String類中的intern 方法

2021-08-26 23:58:16 字數 1216 閱讀 9102

今天在看一本書的時候注意到乙個string的intern()方法,平常沒用過,只是見過這個方法,也沒去仔細看過這個方法。所以今天看了一下。個人覺得給string類中加入這個方法可能是為了提公升一點點效能,因為從常量池取資料比從堆裡面去資料要快一些。(個人感覺)

api上的那幾句關於這個方法,其實總結一句就是呼叫這個方法之後把字串物件加入常量池中,常量池我們都知道他是存在於方法區的,他是方法區的一部分,而方法區是執行緒共享的,所以常量池也就是執行緒共享的,但是他並不是執行緒不安全的,他其實是執行緒安全的,他僅僅是讓有相同值的引用指向同乙個位置而已,如果引用值變化了,但是常量池中沒有新的值,那麼就會新開闢乙個常量結果來交給新的引用,而並非像執行緒不同步那樣,針對同乙個物件,new出來的字串和直接賦值給變數的字串存放的位置是不一樣的,前者是在堆裡面,而後者在常量池裡面,另外,在做字串拼接操作,也就是字串相"+"的時候,得出的結果是存在在常量池或者堆裡面,這個是根據情況不同不一定的,我寫了幾行**測試了一下。

先上結果:

1.直接定義字串變數的時候賦值,如果表示式右邊只有字串常量,那麼就是把變數存放在常量池裡面。

2.new出來的字串是存放在堆裡面。

3.對字串進行拼接操作,也就是做"+"運算的時候,分2中情況:

i.表示式右邊是純字串常量,那麼存放在棧裡面。

ii.表示式右邊如果存在字串引用,也就是字串物件的控制代碼,那麼就存放在堆裡面。

string str1 = "aaa";

string str2 = "bbb";

string str3 = "aaabbb";

string str4 = str1 + str2;

string str5 = "aaa" + "bbb";

system.out.println(str3 == str4); // false

system.out.println(str3 == str4.intern()); // true

system.out.println(str3 == str5);// true

結果:str1、str2、str3、str5都是存在於常量池,str4由於表示式右半邊有引用型別,所以str4存在於堆記憶體,而str5表示式右邊沒有引用型別,是純字串常量,就存放在了常量池裡面。其實integer這種包裝型別的-128 ~ +127也是存放在常量池裡面,比如integer i1 = 10;integer i2 = 10; i1 == i2結果是true,估計也是為了效能優化。

JAVA String類的常用方法

scanner cin new scanner system.in string s cin.nextline int t s.length char s s.charat 0 compareto 的返回值是int,它是先比較對應字元的大小 ascii碼順序 1 如果字串相等返回值0 2 如果第乙個...

Java String類的基本用法

一 string類物件的建立 字串宣告 string stringname 字串建立 stringname new string 字串常量 或stringname 字串常量 二 string類構造方法 1 public string 無參構造方法,用來建立空字串的string物件。string st...

Java String類的常用方法

1,把這個字串和另乙個字串比較 int compareto object o 2,按字典順序比較兩個字串s1compareto s2 返回值是整數型別 按字典順序比較兩個字串,不考慮大小寫 s1 comparetoignorecase str 3,將指定字串連線到字串的末尾 s1.concat s2...