Java String類

String類簡介

字符串嚴格意義上來講並不能算是一個基本數據類型,也就是說沒有任何一門語言會提供有字符串這種數據類型的,而Java爲了方便開發者進行項目的編寫,所以利用其JVM的支持製造了一種可以簡單實用的String類。

範例一:String對象實例化

public class StringDemo {
    public static void main(String[] args) {
        String str = "www.baidu.com";   // 直接賦值
        System.out.println(str);
    }
}

需要注意的是,String這個類裏面之所以可以保存字符串,只要的原因是其中定義了一個數組,也就是說在String裏面所有的字符串中的每一個字符的數據都是保存在了數組之中。

對比源代碼的差別:

JDK1.8以前的String類 JDK1.9以後的String類
aaaa aaaa
JDK1.8以前String保存的是字符數組 JDK1.9以後String保存的是字節數組
private final char[] value; private final byte[] value;
  • JDK1.9以後對於字符串的定義形式實際上是增多了,要比JDK1.8多;
  • JDK1.9開始String類中的數組採用byte類型,而1.8之前使用使用的是char[] 字符數組。
    總結:所謂的字符串就是對數組的一種特殊包裝應用,在String類裏面除了可以使用直接賦值的形式爲對象實例化之外,也可以按照傳統的方式利用構造方法對String進行實例化

範例二:構造方法實例化

public class StringDemo {
    public static void main(String[] args) {
        String str = new String("www.baidu.com");   // 構造方法實例化
        System.out.println(str);
    }
}

字符串比較

public class StringDemo {
    public static void main(String[] args) {
        String strA = "A";
        String strB = new String("A");
        System.out.println(strA == strB);   // false
    }
}

此時的比較並沒有成功,所以發現雖然兩個字符串的內容是相同的,但是“==”也無法得到準確的相等判斷,這種情況下如果要想實現準確的字符串相等判斷,那麼必須使用String類提供的equals()方法。

public class StringDemo {
    public static void main(String[] args) {
        String strA = "A";
        String strB = new String("A");
        System.out.println(strA.equals(strB));   // true
    }
}

面試題:請解釋String比較中“==”與equals()的區別?

  • “==”:進行的是數值比較,如果用於對象比較上,比較的是兩個內存的地址數值;
  • equals():是類所提供的一個比較方法,可以直接進行字符串內容的判斷;

String對象(常量)池

對象池的主要目的,是實現數據的共享處理。以String對象池爲例,裏面的內容主要就是爲了重用,而重用實際就屬於共享設計,但是在Java之中對象池實際上可以分爲兩種:

靜態常量池

  • 指的是程序(*class)在加載的時候會自動將此程序中保存的字符串、普通的常量、類和方法的信息等等,全部進行分配
    範例三:靜態常量池
public class StringDemo {
    public static void main(String[] args) {
        String strA = "ABC";
        String strB = "A" + "B" + "C";
        System.out.println(strA == strB);   // true
    }
}

本程序之中所給出的內容全部都是常量數據(字符串的常量都是匿名對象),所以最終在程序加載的時候會自動幫助開發者處理好相應的連接操作。

運行時常量池

  • 當一個程序(*class)加載之後,裏面可有有一些變量,這個時候提供的常量池就是運行時常量池

範例四:運行時常量池

public class StringDemo {
    public static void main(String[] args) {
        String info = "B";
        String strA = "ABC";
        String strB = "A" + info + "C";
        System.out.println(strA == strB);   // false
    }
}

這個答案不熟悉的朋友可能覺得很奇怪,這個時候之所以是一個false,是因爲程序在加載的時候並不確定info是什麼內容。因爲在進行字符串連接時,info採用的是一個變量,變量的內容是可以修改的,所以它不認爲strB的結果是最終的真實結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章