1.Java內建對字串的支援;
所謂的內建支援,即不用像C語言通過char指標實現字串類型,並且Java的字串編碼是符合Unicode編碼通訊協定,這也意味著不用像C++那樣通過使用string和wstring類實現與C語言相容和Unicode標準。Java內部通過String類實現對字串類型的支援。
這意味著:我們可以直接對字串常量調用和String對象同樣的方法:
//可以再"abc"上直接調用String對象的所有方法
int length="abc".length();
以及
String abc=new String("abc");
int length=abc.length();
2.Java中的字串值是constant(常量的)
這裡的意思是字串類型在建立完成之後,是不能改變其中的值的,從String的成員方法也可以看出沒有能改變值的方法介面;並且像"abc",new String("def")中的”abc","def"存放於Java虛擬機器中的常量池。
以下的代碼中的"abc"存放於常量池中,因此變數a,ab指向的地址均為常量池中同一個"abc"。
複製代碼 代碼如下:
public class StringTest {
public static void main(String[] args) {
String a="abc";
String ab="abc";
String abc=new String("abc");
System.out.println(ab==a);
System.out.println(a==abc);
}
}
/*程式輸出:
* true
* false
* */
那麼動態產生的、可變的字串又是如何?的呢?Java中提供StringBuffer和StringBuilder類實現這一需求;Java中字串串連可以使用“+”操作符; 如:"abc"+"def";這裡的內部實現也可以使用StringBuilder類或者StringBuffer類實現;那麼StringBuilder和StringBuffer內部又是如何?呢?是通過字元數組儲存字串。以下是從JDK附帶的源碼中找到的片段,可以看出StringBuffer內部使用char數組對字串進行儲存,其中的AbstractStringBuilder是StringBuffer的父類:
3.字串中的編碼問題。
這裡要理解兩個問題:如何處理源檔案中的字串編碼?編譯成class檔案或者是代碼在Java虛擬機器運行時字串是採用什麼編碼的?
第一個問題的理解是:原始碼中的字串編碼取決於你的IDE或者文字編輯器。如以下的代碼是使用GBK編碼格式下編輯,然後使用UTF-8和GBK解碼開啟
//GBK編碼格式,使用GBK格式開啟
//GBK編碼格式,使用UTF-8格式開啟,亂碼;如果此時系統預設的編碼格式不是GBK時,在編譯時間需要在javac加入"-encoding GBK"參數選項值;
那麼如何處理這種原始碼編碼的問題呢?答案是在編譯器javac的參數選項-encoding中指定,預設這一參數的值是跟系統預設的編碼一致。Windows的預設編碼一般為GBK (可以通過System.getProperty("file.encoding")獲得該值);在系統預設編碼為GBK,但是原始碼使用UTF-8編碼,此時應該使用 javac -encoding UTF-8 進行編譯。
對 ”編譯成class檔案或者是代碼在Java虛擬機器運行時字串是採用什麼編碼的?“ 這個問題的理解是:首先,Java中的String類型是採用UTF-16編碼實現的,也就是不管在源碼的編碼如何,在Java虛擬機器中的字串都是使用UTF-16編碼實現。這意味著只要編譯器javac正確的理解了源碼檔案中字串的編碼,運行時或者class位元組碼檔案中的字串是獨立於源碼中的編碼格式的。這裡我們可以進一步對java中的char基本類型或者Character類進行理解解,這兩者內部的編碼和java的字串類型一樣,都是基於UTF-16編碼實現的,也就是不論‘a','1'這樣的字元還是漢字在Java中的長度都是16位。
並且在String類型中也有著通過指定定字元編碼,對底層二進位表示和字串之間進行轉化,也就意味著我們可以正確地讀取GBK編碼、UTF-8編碼或者其他編碼的文字檔或者其他輸入資料流將其轉化為記憶體中正確的字串。
如String類中有如下的方法:
public String(byte[] bytes, Charset charset);通過指定定字元集編碼類別型,和相應的byte數組(byte長度為8位)構造字串;
public byte[] getBytes(Charset charset);指定字元集編碼類別型,將字串轉化為byte數組,即字串的二進位表示。
還有需要注意String的另一個成員方法:
public byte[] getBytes();這個方法返回的byte數組,所根據的字元集編碼是指平台預設的字元集編碼,而不一定是UTF-16。