早就聽(tīng)說(shuō)java字符串是不變的;那么到底是怎么回事呢?
public class Immutable { public static String upcase(String s) { return s.toUpperCase(); } public static void main(String a[]) { String q ="howdy"; System.out.PRintln(q); //howdy //String QQ = new String("aaaa"); String qq = upcase(q); System.out.println(qq);//HOWDY System.out.println(q);//howdy }}就像上面的代碼,q作為參數(shù)給了upcase 傳給了qq; 我們可能回想說(shuō),你字符串q經(jīng)過(guò)upcase()以后,傳給qq這個(gè)新字符串,q怎么可能會(huì)不變呢? 因?yàn)椋琿q本來(lái)就只是一個(gè)引用,一個(gè)指向某對(duì)象的引用;
String qq = new String("aaaa"); 引用指向?qū)ο蟮倪^(guò)程那么:
String qq = upcase(q); //等號(hào)右面其實(shí)返回的是一個(gè)引用;一個(gè)全新對(duì)象的引用簡(jiǎn)單來(lái)說(shuō)通過(guò)q引用,找到q引用的對(duì)象,通過(guò)toUpperCase()對(duì)q對(duì)象得到一個(gè)新對(duì)象,將這個(gè)新對(duì)象的引用交給qq,萬(wàn)事大吉;q以及qq是引用,他們指向的對(duì)象可能會(huì)發(fā)生改變,但是實(shí)際創(chuàng)建的對(duì)象不會(huì)有任何改變; 如下:
String s = "abcd"; //s指向abcds = s.concat("ef"); //s指向新字符串a(chǎn)bcdef
那么string為什么不可變呢? 看這里 簡(jiǎn)單而言: 1. 同一個(gè)字符串 “abc”,它在堆中就是一個(gè)對(duì)象,不管有多少所謂新的引用; 2. 其實(shí)也是java的一貫準(zhǔn)則;更明了的讓程序員知道錯(cuò)誤;StringBuilder.append 可以改變對(duì)象值,這樣會(huì)發(fā)生什么呢?當(dāng)新的引用出現(xiàn)并改變字符串,舊的引用也就改變了;發(fā)生了連鎖反應(yīng);
class Test { public static void main(String arg[]) { StringBuilder [] builders = new StringBuilder[3]; StringBuilder a1=new StringBuilder("aaa"); builders[0]=a1; StringBuilder a2 = a1; builders[1]=a2; StringBuilder a3 = a2; a3.append("bbb"); builders[2]=a3; System.out.println(Arrays.toString(builders)); //output :[aaabbb, aaabbb, aaabbb] }}如何實(shí)現(xiàn)String 不變,final+private
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; }所以我們知道 String不是基本類(lèi)型,其實(shí)是一個(gè)類(lèi);當(dāng)我們要操作字符串本身是還是使用StringBuilder 吧;另外StringBuffer為了線程同步消耗了更多的資源;所以單線程使用StringBuilder 更好; ps:這也就是為什么Object有tostring()方法,而基本類(lèi)型沒(méi)有;
關(guān)于PrintStream
public class Turtle { private String name; private Formatter formatter; public Turtle (String name, Formatter f) { this.name = name; this.formatter = f; } public void move ( int x , int y) { formatter.format("%s The Turtle is at (%d,%d)/n",name,x,y); } public static void main(String a[]) { PrintStream stream = System.err; Turtle turtle = new Turtle("tommy",new Formatter( System.out)); Turtle turtle1 = new Turtle("tom",new Formatter(System.err)); turtle.move(5,6); turtle.move(6,8); turtle1.move(9,0); }這個(gè)嘛,用到再看吧
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注