String物件在Java的堆和常量池中的情況

2021-08-14 23:14:37 字數 2040 閱讀 1758

如果不是new出來的string,如果兩個值相等那麼返回true:

string s = "1";

string s1 = "1";

system.out.println(s == s1);

這樣返回的值是true:

可以看出在定義變數s之後只是在常量池中建立值為「1」的常量,當定義s1時會去常量池中查是否存在值為「1」的常量,此時1在定義s的時候已存在,兩者引用位址指向常量池的「1」所以s==s1返回為true。

如果是new出來的string那就要視情況來定:

string s = new

string("1");

string s1 = new

string("1");

system.out.println(s == s1);

這樣返回的是false:

在定義s的時候s是new出來的,此時虛擬機會在堆中新建乙個s的引用物件並在常量池中存放值為「1」的常量,s1同理,在判斷s==s1的時候是判斷的兩者的引用位址而不是值,因為s和s1在堆中分別new了乙個引用位址,所以s==s1為false。

string s = "1";

string s1 = new

string("1");

system.out.println(s == s1);

此時返回的也是false:

s是非new的所以不會在堆中建立引用,s1會在堆中建立引用,所以s指向常量池中的位址,s1指向堆中的位址,所以s==s1為false,反過來先new s再定義非new s1也是一樣的。

intern()方法的目的是當執行此方法的時候會在常量池建立此string的值,當另乙個string定義的時候可以節省記憶體。

string s = new

string("1");

s.intern();

string s1 = "1";

system.out.println(s == s1);

此時返回的是false:

定義s的時候會在堆中建s的應用並在常量池中新建 值為「1」的常量,所以此時執行s.intern();其實是沒有起作用的,當s1定義的時候指向常量池中的「1」,所以s的位址是堆中的s1是常量池,所以兩者的引用位址不同。

string s = new

string("11") + new

string("11");

s.intern();

string s1 = "1111";

system.out.println(s == s1);

此時返回的是true:

當定義s的時候是在堆中建立乙個值為「1111」的引用而在常量池中新建的是「11」的常量,在執行intern()方法後在jdk1.7中為了節省記憶體像s這種定義在常量池中存的是s在堆中的引用位址值為「1111」的常量,所以當s1定義後去常量池中找到「1111」的時候位址是s的引用位址,所以s==s1為true,因為兩者的引用位址是相同的。

所以在進行string的判斷時要使用.equals()方法喲

java中String物件的常用方法

public class test system.out.println string str1 new string c string str2 new string c,1,6 system.out.println str1 str2 system.out.println str1.charat...

java中string物件中的split方法的使用

我們都知道string物件中的split方法,是用來按照根據匹配給定的正規表示式來拆分此字串。split方法有兩種 一種為 public stringsplit stringregex 另一種為 public stringsplit stringregex,intlimit 但是在實際應用中我們常用...

Java基礎回顧 String物件中常用的方法

1 charcodeat方法返回乙個整數,代表指定位置字元的unicode編碼。strobj.charcodeat index 說明 index將被處理字元的從零開始計數的編號。有效值為0到字串長度減1的數字。如果指定位置沒有字元,將返回nan。例如 var str abc str.charcode...