建立字串時的那些物件 引用 常量池

2021-09-10 22:59:24 字數 2034 閱讀 8789

一、基本建立方法

string str1 = new string("hello");

string str2 = str1.intern();

system.out.println(str1 == str2);

①類在編譯時,字面量"hello"被新增到字串池中,同時堆中建立乙個字串物件,其引用儲存到字串池」hello"中。

②類在執行時,根據new關鍵字,在堆中另外建立乙個字串物件,其引用由str1持有。

③str1呼叫intern()方法時,虛擬機器先到字串池中查詢是否存在與"hello"內容相同的字串池項,根據①,存在此項,返回此項的引用,即對應①中在堆內建立的字串物件。

④==比較str1和str2的引用是否相同,雖然兩者都在堆中,但是不是同乙個物件,因此輸出false.

string str1 = "hello";

string str2 = str1.intern();

system.out.println(str1 == str2);

①類在編譯時,字面量"hello"被新增到字串池中,同時在堆中建立乙個字串物件,其引用由str1持有。

②類在執行時,由str1呼叫intern()方法,回到字串池中查詢是否存在與"hello"內容相同的字串池項,根據①,存在此項,返回此項的引用,即對應①中在堆內建立的字串物件。

③str1與str2持有的引用相同,因此str1==str2結果為true.

二、拼接

string str3 = "helloworld";

string str4 = "hello" + "world";

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

①類在編譯時,字面量"helloworld"被新增到字串池中,同時在堆中建立乙個字串物件,其引用由str3持有。

②編譯期可優化出"hello"+「world"為"helloworld」,先到字串池中查詢,把①中建立的物件的引用複製給str4.

③比較str3和str4的位置,相等,輸出true.

string str3 = "helloworld";

string str4 = "hello" ;

string str5 = str4 + "world";

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

①編譯期字串池中有"helloworld",「hello」,"world"三個項,堆中建立三個字串物件,"helloworld"對應的字串物件的引用交給str3,"hello"對應的字串物件的引用交給str4,「world"對應的字串物件的引用沒有交給任何字串變數;

②執行時,才能讀取字串變數str4的引用,再執行拼接操作,此處不去字串池中查詢匹配的字串和引用,而是在堆中另外建立乙個字串物件,其引用由str5持有;

③假如此處變數str4和"world"拼接而得的字串不是"helloworld"而是其他的比如"bonjourworld」,是否會新增該結果到字串池呢?使用intern()方法可以新增,jvm不會自動去新增。

④str5指向堆中新建的字串物件,str3指向編譯時建立的字串物件,輸出false.

string str3 = "helloworld";

string str4 = "hello" ;

string str5 = "world";

string str6 = str4 + str5;

system.out.println(str3 == str6);

同上,str6在堆中另外建立的物件,str3指向編譯時建立的字串物件,輸出false,

三、總結

字串池中存放的不是物件,而是字串和在堆中的物件的引用。

intern()方法使用equals()比較,是根據字串的內容比較,而不是字串物件的引用。

字串池中各個字串都是唯一的,不會出現"abcd" 位址***x1,「abcd」,位址***x2的情況。

物件轉字串時重複物件變為引用位址

起因 redis的資料集 只支援字元型別的資料,所以object轉為字串時 出現引用的問題 mapuser info new hashmap user info.put user info 1 list list1 new arraylist for int i 0 i 2 i system.out...

字串常量和字元常量的區別

字串常量和字元常量是不同的量。它們之間主要有以下區別 1 字元常量由單引號括起來,字串常量由雙引號括起來。2 字元常量只能是單個字元,字串常量則可以含乙個或多個字元。3 可以把乙個字元常量賦予乙個字元變數,但不能把乙個字串常量賦予乙個字元變數。在 語言中沒有相應的字串變數。這是與basic 語言不同...

java中物件的引用字串的引用

一 物件的引用 1.student stu1 new student 小明 stu1指向新建立的堆記憶體空間 student stu2 null 只在棧中建立變數stu2 stu2 stu1 stu2引用stu1,stu1和stu2都指向同乙個堆記憶體位址 stu2.name 小紅 system.o...