国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java 讀書(shū)筆記13 字符串

2019-11-06 07:39:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

字符串

不可變的字符串

早就聽(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不可變

那么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)有;

Formatter

public class Receipt { Formatter formatter = new Formatter(System.out); public void printtest() { formatter.format("%15s %5d %10.3f/n","this is a test",10,3.1564*3); formatter.format("%15s %5d %10.2f/n","this ",10,3.1*3); } public static void main(String a[]) { Receipt receipt =new Receipt(); receipt.printtest(); }}

關(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); }

正則表達(dá)式

這個(gè)嘛,用到再看吧


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巩留县| 济源市| 开阳县| 四川省| 利辛县| 怀柔区| 饶平县| 泗水县| 托克托县| 合江县| 丰宁| 双牌县| 三亚市| 岑巩县| 三都| 河北省| 涞水县| 延津县| 罗山县| 浙江省| 宽城| 湖口县| 阳新县| 密云县| 正蓝旗| 平遥县| 乐安县| 霍山县| 龙陵县| 乡城县| 开远市| 凌海市| 获嘉县| 龙山县| 萍乡市| 云梦县| 开远市| 镇江市| 剑阁县| 南江县| 周宁县|