字符
Java用char類型來表示字母、數字、標點符號以及其他特殊字符。Java基於Unicode4.0來表示每一個字符,Unicode的設計目標是容納世界上所有主要語言中的字符。
Java使用16位即2個字節來表示字符,這意味着Java可以表示216,即65536個字符,看起來很多,但是還不能支持整個Unicode標准中的所有字符。如果超過這個范圍,Java允許使用int類型來表示字符,int類型字長4個字節32位,可以表示232位的字符。
Java中表示字符的最簡單的方式如下,使用單引號嵌入字符:
char capitalA = 'A';
字符從本質上講是數字。每一個字符映射到一個范圍在0到65 535的正整數,每一個字符在Unicode標准中都有對應的數字值,稱為Unicode值。我們可以用如下方法來查看字符的Unicode碼:
char word = 'A';
int p = 65;
System.out.println("a在unicode表中的順序位置是:" + (int) word);
System.out.println("unicode表中的第65位是:" + (char) p);
並不是所有的字符都可以通過鍵盤輸入到計算機。您可以用Unicode轉義符(\u或者\U,后面跟着四位的十六進制數字)來表示Unicode字符:
char word = '\U0041'
特殊字符
Java定義了一些用來格式化輸出的特殊字符。Java使用轉義符來表示這些特殊字符,該轉義符由一個反斜線(\)和一個隨后的助記符組成:
回車 '\r'
換行 '\n'
Tab '\t'
換頁 '\f'
退格 '\b'
由於一對單引號和反斜線對於字符表示有特殊的意義,所以您必須用轉義符來表示它們。
單引號 '\'
換碼符 '\\'
雙引號 '\'''
注意:雙引號不需要轉義。
字符串
字符串對象表示固定長度的字符序列,String類可能是Java程序中使用的最頻繁的類了。
來看兩種創建字符串的方式:
String a = "abc";
String b = new String("abc");
實際運用中,我們要避免第二種方式,第二種方式創建了兩個String對象。首先,Java虛擬機創建了String對象“abc”。然后,java虛擬機創建一個新的String對象,並把字符串“abc”傳入構造函數。這是一次完全沒有必要的構造,既影響了性能,也提高了代碼閱讀難度。
由於字符串是字符序列,所以可以嵌入特殊字符。
String s = "\t\n";
字符連接
您可以將一個字符串和另一個字符串連接起來,從而生成第三個字符串。
String abcd = "ab".concat("cd")
在Java中,字符串連接是一個非常常用的操作。您可以用加號(+)作為字符串連接的捷徑。
String abcd = "ab" + "cd";
在實際編碼中,我們也基本都是這么做的。
+符號既可以操作數值的加減,也可以用於連接字符串,這叫做操作符的重載。
字符串的不可改變性
在JavaAPI文檔中我們可以看到String類的定義:
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
String類是一個final類,這代表一個String對象是不可改變的,String類的方法中我們也找不到任何能夠改變字符串的值和長度的方法。這就是字符串的不可改變性。
當我們進行連接字符串操作的時候,Java虛擬機沒有改變其中任何一個字符串,而是創建了一個新的String對象,把連接后的結果賦予了它。Sun將String設計成不可改變的,這是為了讓String的行為最優化。因為String在多數應用中都被大量使用,所以它的優化是非常關鍵的。
StringBuilder
類java.lang.StringBuilder提供了動態創建字符串的能力。使用方法上與StringBuffer是一樣的,不同之處在於,StringBuilder不是線程安全的,但是更搞笑,StringBuffer是現成安全的。
系統屬性
在程序中,我們經常直接在字符串中寫入特殊字符,比如換行符"\n",這樣做不僅冗余,而且難以移植,不同平台的換行符也不同。
類java.lang.System中可以找到這個問題的解決方案,該類包含了方法getProperty,此方法以一個系統屬性的鍵值作為參數,並返回與該鍵值相關聯的系統屬性。Java虛擬機在啟動的時候,就設置好了若干系統屬性。多數屬性返回與虛擬機以及當前執行環境相關的信息。API文檔中針對getProperties方法,給出了可用的屬性列表。例如換行符的屬性是line.separator。