java中String比較詳細的講解

2021-09-01 15:46:46 字數 2558 閱讀 3734

字串物件是一種特殊的物件.string類是乙個不可變的類..也就說,string物件一旦建立就不允許修改.

string類有乙個對應的string池,也就是 string pool.每乙個內容相同的字串物件都對應於乙個pool裡的物件.

一、看下面一段**.

string s = new string("abc");

string s1 = "abc";

string s2 = new string("abc");

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

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

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

請問 前面三條語句分別建立了幾個物件,分別是什麼.後面的輸出分別是什麼

(1)string s = new string("abc"); 這句,建立了兩個物件..其內容都是"abc".注意,s不是物件,只是引用.只有new生成的才是物件.

建立的流程是,首先括號裡的"abc"先到string pool裡看有沒"abc"這個物件,沒有則在pool裡建立這個物件..所以這裡就在pool建立了乙個"abc"物件.然後 通過new語句又建立了乙個"abc"物件..而這個物件是放在記憶體的堆裡. .這裡的s指向堆裡的物件.

(2) string s1 = "abc"; 這條語句,s1當然還是引用.沒啥可說的.後面的"abc".其實就是上面括號裡的"abc".執行的是相同的操作.即 在pool裡查詢有沒"abc"這個物件.沒有則建立乙個...很顯然,第一條語句在pool裡已經建立了乙個"abc".所以這條語句沒有建立物件,s1指向的是pool中的"abc"

(3)string s2 = new string("abc"); 這條語句,其實和第一條是一樣的。因為第一條已經在pool中建立了"abc"這個物件,所以這條語句由於在pool中先找到了"abc",所以不用在pool中再次建立"abc"了,而只是在堆裡建立了乙個新的"abc"物件.s2指向的是堆裡的"abc".注意,雖然內容都是"abc",s與s2表示的是不同的物件

(4)接下來就很好說了.下面的三個==判斷.(注意,==永遠是判斷記憶體位址是否相等) s與s1,乙個指向堆裡的物件,乙個指向pool裡的.很明顯是不同的物件.s與s2.上面說了,雖然都是指向堆裡的物件,內容也是"abc",但是也不是相同的物件.s1與s2.乙個指向pool,乙個指向堆.也不是相同的物件.所以三個都返回false.

二、第二個問題

string s = new string("abc");

string s1 = "abc";

string s2 = new string("abc");

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

system.out.println(s == s2.intern());

system.out.println(s1 == s2.intern());

求最後輸出是什麼

解答.最後的答案是 false false true

intern()方法.按照jdk的幫助文件來說,是返回字串物件的規範化表示形式。通俗一點說,就是返回對應這個字串內容的那個pool裡的物件.這樣說也許還看不太明白,那可以拿具體例子來說

s1.intern().他的執行流程是,在pool裡去查詢s1對應的內容(也就是"abc").如果找到,則返回pool裡的物件.如果沒有(老實說,我沒想到有哪種情況是沒有的),則在pool建立這個物件,並返回...

這樣就很容易理解了.s1.intern返回的是pool裡的"abc"物件.與s這個堆裡的物件肯定不同,返回false.同理,s與s2.intern()也肯定不同,返回false.第三個,s1與s2.intern().其中s2.intern()返回的是pool中的"abc"物件,而s1也是指向pool中的"abc"物件.所以返回的是true。

三、第三個問題

string hello = "hello";

string hel = "hel";

string lo = "lo";

system.out.println(hello == "hel" + "lo");

system.out.println(hello == "hel" + lo);

求輸出的結果

解答 true false

首先,上面已經說明了,hello hel lo這三個都是指向pool中的物件..

現在我們考慮"hel" + "lo" 按照內容來說,兩個相加也就是"hello".這個時候,這個會返回pool中的"hello"物件.所以,hello == "hel" + "lo" 返回的是true .

而"hel" + lo 雖然內容也是"hello",但是它將在堆裡面生成乙個"hello"物件,並返回這個物件...所以這裡的結果是false

總結一下就是,如果加號兩邊的是字面值(字面值就是直接在""裡寫的值,比如上面的"hel"與"lo"),那麼將在pool裡查詢有沒對應內容的物件(這裡的內容就是"hello"),並返回pool裡的物件.這和hello是一樣的....

如果加號兩邊不滿足上面的條件(比如,兩邊的值是引用值或者堆裡的字串物件).那麼將不會再pool裡查詢"hello",而是直接在堆裡生成乙個新的物件...

string 詳細學習

string s1 預設初始化,s1是乙個空字串 string s2 s1 s2是s1的副本 string s2 s1 等價於s2 s1 s2是s1的副本 string s3 value s3是字面值 value 的副本,除了字面值最後的那個空字元 string s3 value 與上面等價 str...

Java中String方法substring講解

public stringsubstring int beginindex 返回乙個新的字串,它是此字串的乙個子字串。該子字串始於指定索引處的字元,一直到此字串末尾。例如 harbison substring 3 returns bison emptiness substring 9 returns...

java中String常用方法

public int length 獲取字串含有的字元個數,拿到字串長度。public string concat string str 將當前字串和引數字串拼接成為返回值新的字串。public char charat int index 獲取指定索引位置的單個字元。索引從0開始 public in...