string對象是不可變的,字元串一旦建立,内容不能再改變。底層用char[]存放,故可以使用字元串直接量或字元數組建立一個字元串對象(其中string類中有13個構造方法),下面的語句使用字元串直接量
java将字元串直接量看着string對象,是以,下面的語句是合法的:
還可以用字元數組建立一個字元串
注意:string變量存儲的是對string對象的引用,string對象裡存儲的才是字元串的值。嚴格地講,術語string變量、string對象和字元串值是不同的。但在大多數情況下,它們之間的差別是可以忽略的。為簡單起見,術語字元串将經常被用于指string變量、string對象和字元串的值。
不可變字元串與限定字元串
string對象是不可變的,它的内容是不能改變的。下列代碼會改變你字元串的内容嗎?
答案是不能.第一條語句建立了内容為“java”的string對象,并将其引用指派給s。第二條語句建立了一個内容為“html”的新string對象,并将其引用指派給s。指派後第一個string對象仍然存在,但是不能再通路它,因為變量s現在指向了新的對象。
因為字元串是不可改變的,但同時又會頻繁的使用,是以java虛拟機為了提高效率并節約記憶體,對具有相同字元序列的字元串直接量使用同一個執行個體。這樣的執行個體稱為限定的(interned)字元串。例如,下面的語句:
從位元組碼和常量池的角度來分析下剛才這些代碼的底層原理
string的常用操作
字元串的替換和分割
一旦建立了字元串,它的内容就不能改變。但是,方法replace、replaceall和replacefirst會傳回一個源自原始字元串的新字元串(并未改變原始字元串)。replace方法有幾個重載方法。split方法可以從一個指定分隔符的字元串中提取辨別。
string token = "趙老師是一個好老師,你喜歡趙老師嗎?";
//将所有的趙老師替換為miss cang
string info = token.replace("趙老師", "miss cang");
system.out.println(info);
//替換第一個找到的趙老師
system.out.println(token.replacefirst("趙老師", "miss cang"));
//替換全部,支援模式比對(正規表達式)
system.out.println(token.replaceall("趙老師", "miss cang"));
依照模式比對、替換和分割
詳情請參考正規表達式
字元串與數組之間的轉換
字元串不是數組,但是字元串可以轉換成數組,反之亦然。
将字元和數值轉換成字元串
回顧下,可以使用double.parsedouble(str)或者integer.parseint(str)将一個字元串轉為一個double或者int值,也可以使用字元串的連接配接操作符将字元或者數值轉換為字元串。另外一種将數字轉為字元串的方法是使用重載的靜态valueof方法。
格式化字元串
string.format(format,item1,item2,...,itemn)
stringbuffer和stringbuilder
stringbuffer和stringbuilder類似于string類,差別在于string類是不可改變的。一般來說,隻要使用字元串的 地方,都可以使用stringbuffer/stringbuilder類.stringbuffer和stringbuilder比string更加靈活。可以給一個stringbuffer和stringbuilder中添加、插入或追加新的内容,但是string對象一旦建立,它的值就固定了。
除了stringbuffer中修改緩沖區的方法是同步的(隻有一個任務被允許執行),stringbuffer與stringbuilder類是很相似的。如果是多任務并發通路,就使用stringbuffer,可以防止stringbuffer崩潰。而如果是單任務通路,使用stringbuilder會更有效。stringbuffer和stringbuilder中的構造方法和其它方法機會是完全一樣的
示例:判斷回文字元串時忽略既非字母又非數字的字元