2019/7/11 17:29? ?二刷結(jié)束留念? ??
????10-StringBuffer(常見(jiàn)功能-添加)
? ? ? ? 說(shuō)完了String嗤疯,接下來(lái)我們來(lái)說(shuō)StringBuffer冤今,buffer是緩沖區(qū)的意思。我們都知道String字符串一旦粗現(xiàn)就不可以被修改茂缚,而StringBuffer可以用于修改~
? ??????StringBuffer是字符串緩沖區(qū)戏罢。是一個(gè)容器。??
? ? ? ? 容器的特點(diǎn):
? ? ? ? C Creat U Update R Read D Delete
????????因此脚囊,StringBuffer的功能有:
? ? ? ? 1龟糕,存儲(chǔ)。
? ??????2悔耘,刪除讲岁。
? ??????3,獲取衬以。
? ? ? ? 4缓艳,修改。
? ??????5看峻,反轉(zhuǎn)阶淘。
? ??????1,存儲(chǔ)互妓。
????????StringBuffer位于java.lang包中溪窒。
????????注意它是final類,所以不能被繼承喔冯勉。
? ? ? ? 我們發(fā)現(xiàn)澈蚌,它有一大堆a(bǔ)ppend方法:
?????????StringBuffer append():將指定數(shù)據(jù)作為參數(shù)添加到已有數(shù)據(jù)結(jié)尾處。
????????試一下:
????????運(yùn)行:
????????為什么打印結(jié)果一樣捏珠闰?
? ? ? ? 我們?cè)偌右痪洌?/p>
????????試一下:
? ? ? ? 所以sb和sb1指向的是同一個(gè)對(duì)象惜浅。
? ? ? ? 這就是容器。
? ? ? ? 緩沖區(qū)有一個(gè)面盆理論伏嗜,緩沖區(qū)就相當(dāng)于那個(gè)面盆坛悉,不管往里面加面還是加水伐厌,還是那個(gè)盆。
? ? ? ? 所以其實(shí)不用像剛剛那樣寫(xiě)裸影,我們直接這樣寫(xiě)就OK:
????????運(yùn)行:
????????如果我們不想在字符串后面添加挣轨,想在前面添加呢?
? ? ? ? 滿足你~
? ? ? ? 還有可以在前面添加的方法轩猩,不過(guò)不叫append了卷扮,它叫insert:
? ??????StringBuffer insert(index,數(shù)據(jù)):可以將數(shù)據(jù)插入到指定index位置。
????????我們?cè)囈幌拢?/p>
????????運(yùn)行:
????????我們?cè)僭囋嚲迦氲浇菢?biāo)為100的位置呢晤锹?
????????編譯運(yùn)行:
? ??????總結(jié)一下,StringBuffer的特點(diǎn):
? ? ? ? 1彤委,長(zhǎng)度是可變化的鞭铆。(數(shù)組也是容器,但長(zhǎng)度不可變化)
? ??????2焦影,可以直接操作多個(gè)數(shù)據(jù)類型车遂。(數(shù)組一次只能操作一個(gè)數(shù)據(jù)類型)
? ? ? ? 3,最終會(huì)通過(guò)toString方法辦成字符串斯辰。
????????什么時(shí)候用呢舶担?
? ? ? ? 數(shù)據(jù)類型不確定、而且最終要變成字符串彬呻、而且最終個(gè)數(shù)也不確定的時(shí)候衣陶,緩沖區(qū)比數(shù)組要方便。(當(dāng)然它倆各有利弊喔)
????11-StringBuffer(常見(jiàn)功能-刪除和修改)
? ? ? ? 添加說(shuō)完說(shuō)刪除~
? ??????2闸氮,刪除祖搓。
????????點(diǎn)進(jìn)第一個(gè)看一下:
????????看一下,這里有注明湖苞,頭是包含的,尾是不包含的详囤。記住财骨,在Java中,只要是需要取字符串一段藏姐,頭都是包含的隆箩,尾都是不包含的哦。
????????StringBuffer delete(start,end):刪除緩沖區(qū)中的數(shù)據(jù)羔杨,包含start捌臊,不包含end。
????????StringBuffer delete(index):刪除指定位置的字符兜材。
????????試一下哦:
????????運(yùn)行:
? ? ? ? 現(xiàn)在想要將緩沖區(qū)的所有內(nèi)容都刪掉:
? ? ? ? 這樣也不是不可以理澎,但是把盆都扔掉了逞力,換了一個(gè)新盆,所以太敗家啦糠爬!
? ? ? ? 我們要勤儉持家呢:
? ? ? ? 有一個(gè)奇奇怪怪的想法:
? ? ? ? 這樣會(huì)怎樣呢寇荧?
? ? ? ? 運(yùn)行試試:
? ? ? ? 什么都沒(méi)刪呢~
? ? ? ? 那這樣呢?
? ? ? ? 這樣就錯(cuò)了喔:
? ? ? ? 如果想刪一個(gè)呢执隧?不用使用這個(gè)方法揩抡,麻煩啦。用它:
? ??????3镀琉,獲取峦嗤。
? ? ? ? 這些都是我們的老朋友啦:
? ? ? ? char charAt(int index);
? ??????int indexOf(String str);
? ??????int lastIndexOf(String str);
? ??????int length();
? ? ? ? String substring(int start,int end);(注意這個(gè)方法我們也看很多遍啦,String類有屋摔,這個(gè)方法訪問(wèn)的還是String烁设,不是StringBuffer)
? ? ? ? 因?yàn)樗鼈兊挠梅ㄎ覀兦懊娑紝W(xué)過(guò)啦,所以不再贅述~? ?
? ? ? ? 我們接著看看修改:
4凡壤,修改署尤。
? ? ? ? 說(shuō)是修改,不如說(shuō)是替換~替換掉原先字符串的內(nèi)容亚侠。
?????????StringBuffer replace(start,end,string);??
? ? ? ? 試一下:
? ? ? ? 運(yùn)行:
? ? ? ? 這是替換一串字符的方法曹体,還有只替換一個(gè)字符的方法:
? ? ? ??void setCharAt(int index,char ch);
? ? ? ? 注意它不返回StringBuffer,它是替換完就完事兒了硝烂,要小心哦箕别。
? ? ? ? 試一下:
? ? ? ? 運(yùn)行:
????????5,反轉(zhuǎn)滞谢。
? ??????StringBuffer reverse()串稀;
????????這個(gè)方法也不贅述啦。
????????6狮杨,還有一個(gè)神秘方法母截,它是什么用處呢:
? ??????void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin );
????????我們?cè)囍褂靡幌拢?/p>
? ? ? ? 運(yùn)行結(jié)果:
????????所以,它的作用是橄教,將緩沖區(qū)中的指定數(shù)據(jù)存儲(chǔ)到字符數(shù)組中清寇。
????????做了一個(gè)小標(biāo)識(shí)表示了一下參數(shù)的意義:
????12-StringBuilder
? ? ? ? 講一個(gè)新的對(duì)象,StringBuilder护蝶。
? ? ? ? 注意华烟,它是從1.5才開(kāi)始的哦:
? ? ? ? 在JDK1.5之后出現(xiàn)了StringBuffer。
? ??????StringBuffer是線程同步持灰。
? ? ? ? StringBuilder是線程不同步盔夜。
? ? ? ? 我們?cè)搩?yōu)先用哪個(gè)呢?
? ? ? ? 后者。
? ? ? ? 因?yàn)樗切鲁龅奈沽矗瑳](méi)有好處Java才不會(huì)出嘞返十,嘿嘿(☆_☆)/~~
? ? ? ? 認(rèn)真說(shuō)一下原因:
? ? ? ? 我們?cè)谑褂靡粋€(gè)容器的時(shí)候,如果還有另外的線程可以對(duì)它進(jìn)行修改衩藤、刪除之類的吧慢,那么這個(gè)數(shù)據(jù)在使用中就會(huì)錯(cuò)亂,并發(fā)就容易產(chǎn)生錯(cuò)亂哦赏表。
? ? ? ? 如果我們?cè)诓僮鞯臅r(shí)候检诗,讓它不能被其他線程動(dòng),這叫做同步瓢剿,一次只有一個(gè)執(zhí)行逢慌。是不是就有安全感多了呀?StringBuffer就是這樣的间狂,它是安全的攻泼。
? ? ? ? 而StringBuilder是不安全的。
? ? ? ? 那么為什么要選擇StringBuilder呢鉴象?
? ? ? ? 因?yàn)槿绻菃尉€程程序忙菠,StringBuffer效率就會(huì)比較低(要判斷鎖),而StringBuilder就快捷很多纺弊。
? ? ? ? 所以牛欢,StringBuilder類中也有寫(xiě)到,它更適用于單線程淆游,而多線程的時(shí)候建議使用StringBuffer:
? ??????Java的升級(jí)無(wú)非就是圍繞以下三點(diǎn):
? ??????1傍睹,提高效率。
? ??????2犹菱,簡(jiǎn)化書(shū)寫(xiě)拾稳。
? ? ? ? 3,提高安全性腊脱。
????????StringBuilder顯然屬于第一點(diǎn)访得。
? ? ? ? 在單線程開(kāi)發(fā)中,還是建議使用StringBuilder陕凹,因此震鹉,剛剛的代碼可以改成這樣:
????13-基本數(shù)據(jù)類型對(duì)象包裝類
? ? ? ? 蠻重點(diǎn)的一部分~
? ? ? ? 按照J(rèn)ava面向?qū)ο蟮脑瓌t,Java將萬(wàn)事萬(wàn)物都視為對(duì)象捆姜,包括基本數(shù)據(jù)類型。
? ? ? ? 可是基本數(shù)據(jù)類型包裝成對(duì)象有什么用呢迎膜?
? ? ? ? 以int類型為例泥技,它是不是有自己的取值范圍?是不是有多種進(jìn)制表現(xiàn)形式?比如我們想把一種進(jìn)制類型轉(zhuǎn)換為其他進(jìn)制的表現(xiàn)形式珊豹,怎么做呢簸呈?這個(gè)變起來(lái)是不是整數(shù)自己最清楚啦。
? ? ? ? 所以店茶,如果把整數(shù)定封裝成對(duì)象蜕便,里面定義這樣的功能,我們指揮起來(lái)是不是就很方便啦贩幻?
? ? ? ? 所以轿腺,Java就這樣做啦。
? ? ? ? 比如:
? ? ? ? byte是基本數(shù)據(jù)類型丛楚,它有一個(gè)基本數(shù)據(jù)類型對(duì)象Byte族壳,叫做引用數(shù)據(jù)類型。
? ? ? ? 同理趣些,short對(duì)應(yīng)short仿荆,int對(duì)應(yīng)Integer,long對(duì)應(yīng)Long坏平,boolean對(duì)應(yīng)Boolean拢操,float對(duì)應(yīng)Float,double對(duì)應(yīng)Double舶替,char對(duì)應(yīng)Character令境。
? ? ? ? 我們還是以int為例來(lái)講這個(gè)對(duì)象。
? ? ? ? 我們?cè)趈ava.lang包中找到Integer這個(gè)類:
? ? ? ? 當(dāng)然坎穿,也看到了其他很熟悉的數(shù)據(jù)類型:byte呀展父,double呀,float呀玲昧,etc.
? ? ? ? 點(diǎn)進(jìn)去:
? ? ? ? 把一個(gè)整數(shù)封裝成一個(gè)對(duì)象栖茉,好處就體現(xiàn)出來(lái)啦。
? ? ? ? 首先孵延,最大值和最小值是固定的值:
? ? ? ? 我們直接拿來(lái)用就好啦吕漂,就不用自己算啦。
? ? ? ? 試一下:
? ? ? ? 運(yùn)行:
? ??????其實(shí)尘应,基本數(shù)據(jù)類型包裝類的最常見(jiàn)作用惶凝,就是用于基本數(shù)據(jù)類型和字符串類型之間做轉(zhuǎn)換。
????????包括犬钢,基本數(shù)據(jù)類型轉(zhuǎn)成字符串苍鲜,字符串轉(zhuǎn)成基本數(shù)據(jù)類型。
? ??????基本數(shù)據(jù)類型轉(zhuǎn)成字符串:
????????有一個(gè)很簡(jiǎn)單的做法:基本數(shù)據(jù)類型+"";
? ? ? ? 但是我們有更專業(yè)的呢玷犹,Integer為我們定義了:
? ? ? ??基本數(shù)據(jù)類型.toString(基本數(shù)據(jù)類型值);
????????如:Integer.toString(34);//將整數(shù)34變成字符串“34”
? ??????字符串轉(zhuǎn)成基本數(shù)據(jù)類型:
????????我們?cè)谏暇W(wǎng)的時(shí)候混滔,填寫(xiě)資料輸入的都是字符串,而現(xiàn)在想判斷其中的年齡是否大于20歲,就屬于數(shù)學(xué)運(yùn)算坯屿,所以此時(shí)就必須將字符串轉(zhuǎn)成整數(shù)油湖,才可以判斷~
? ? ? ? 在Integer類中,這個(gè)方法叫:
? ? ? ? 演示一下:
? ? ? ? 運(yùn)行:
? ? ? ? 而字符串轉(zhuǎn)換成各種數(shù)據(jù)類型的方法基本都是:
?????????xxx a=Xxx.parseXxx("......");
????????如领跛,int a=Integer.parseInt("123");
? ? ? ? double?b=Double.parseDouble("12.23");
? ? ? ? 下面說(shuō)兩個(gè)比較特殊的:
? ? ? ? 第一個(gè)Boolean:
? ? ? ? 帶雙引號(hào)的"true"和不帶雙引號(hào)的true乏德,絕對(duì)不一樣喔。
? ? ? ? boolean c=Boolean.parseBoolean("true");
? ? ? ? 字符類型Character沒(méi)有parse....這個(gè)方法吠昭,因?yàn)樗旧砭褪且粋€(gè)字符喊括,并不是字符串哦。
? ? ? ? 會(huì)不會(huì)有這種情況怎诫,我們想要將并不是某種數(shù)據(jù)類型的字符串瘾晃,轉(zhuǎn)換成那種數(shù)據(jù)類型?
? ? ? ? 比如:
? ? ? ? 加上a之后幻妓,這個(gè)字符串就不是一個(gè)整形的數(shù)據(jù)了蹦误。
? ? ? ? 運(yùn)行之后會(huì)報(bào)錯(cuò)哦,數(shù)字格式異常:
? ? ? ??進(jìn)行進(jìn)制轉(zhuǎn)換肉津。
????????十進(jìn)制轉(zhuǎn)換成其他進(jìn)制:
? ??????toBinaryString();
? ??????toHexString();
? ? ? ? toOctalString();
? ? ? ? 使用一下强胰,十進(jìn)制轉(zhuǎn)二進(jìn)制:
? ? ? ? 運(yùn)行:
? ? ? ? 十進(jìn)制轉(zhuǎn)十六進(jìn)制:
? ? ? ? 運(yùn)行:
? ? ? ? 其他進(jìn)制轉(zhuǎn)換成十進(jìn)制:
? ? ? ? 使用一下:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 再換一下:
? ? ? ? 運(yùn)行,:
? ? ? ? 再試試十六進(jìn)制~
? ? ? ? 運(yùn)行:
? ? ? ? 能看出來(lái)了8~使用應(yīng)該沒(méi)問(wèn)題喔~
? ? ? ? 注意妹沙,這樣寫(xiě)會(huì)報(bào)錯(cuò)哦:
? ? ? ? 對(duì)啦偶洋,剛剛那個(gè)字符串轉(zhuǎn)換成數(shù)據(jù),講的都是靜態(tài)的方法距糖。
? ? ? ? 我們也可以將數(shù)據(jù)封裝成玄窝,比如說(shuō)Integer對(duì)象,這個(gè)時(shí)候就有一個(gè)intValue方法:
? ? ? ? 它也可以將Integer類型對(duì)象轉(zhuǎn)換成int類型的值悍引。
? ? ? ? 例:
? ? ? ? Integer i=new Integer("123");
? ? ? ? int num=i.intValue();
????14-基本數(shù)據(jù)類型對(duì)象包裝類新特性
? ? ? ? 這種情況下恩脂,結(jié)果會(huì)是什么呢?
? ? ? ? ?運(yùn)行結(jié)果:
????????接下來(lái)介紹一下JDK1.5版本以后出現(xiàn)的新特性趣斤。
? ? ? ??自動(dòng)裝箱俩块。
?????自動(dòng)拆箱。
? ? ? ? 自動(dòng)拆箱的原理:
? ? ? ? 注意浓领,1.5之后玉凯,它還可以為null:
? ? ? ? 但是在這個(gè)例子中,因?yàn)楹竺嬗幸粋€(gè)x+2的運(yùn)算联贩,所以運(yùn)行失敗了:
? ? ? ? 所以漫仆,有了新特性之后,它的健壯性會(huì)差一點(diǎn)泪幌,使用之前不要忘記判斷是否為空盲厌,當(dāng)它不為空的時(shí)候才能做運(yùn)算~為null要小心玄渗,會(huì)拋控制異常,一拋控制異常狸眼,程序就會(huì)停掉,因?yàn)樗鼘儆赗untime異常浴滴。
? ? ? ? 再介紹一個(gè)小的新特性~
? ? ? ? 先給例子:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 都是數(shù)拓萌,怎么就差這么大呢?
? ? ? ? 因?yàn)閍和b指向了同一個(gè)Integer對(duì)象升略。
????????127在byte范圍內(nèi)微王,對(duì)于新特性,如果該數(shù)值已經(jīng)存在品嚣,則不會(huì)再開(kāi)辟新的空間炕倘。
????????注意看~127和128的最大區(qū)別在于,127是byte類型數(shù)據(jù)范圍的臨界點(diǎn)(-128~127)翰撑,127在這個(gè)范圍內(nèi)罩旋,它為了節(jié)省內(nèi)存就不會(huì)開(kāi)辟新的內(nèi)存空間,超過(guò)這個(gè)范圍眶诈,它就會(huì)開(kāi)辟新的內(nèi)存空間涨醋。
? ? ? ? 所以,在這個(gè)例子中逝撬,Integer a=127;之后浴骂,127已經(jīng)在內(nèi)存空間當(dāng)中了,當(dāng)再次Integer b=127;之后宪潮,b就直接指向原有的127對(duì)象溯警,就不會(huì)再建立新的對(duì)象了~
? ? ? ? 面試中可能會(huì)用的小tips,開(kāi)發(fā)中一般不會(huì)刻意這樣判斷~
? ? ? ? 另外狡相,Integer還有這樣一個(gè)方法:
? ? ? ? 數(shù)字能不能比較排序梯轻?
? ? ? ? 可以呀。
? ? ? ? 比如1在2前面谣光,2在1后面檩淋,1和1相等,都是ASCII碼排序萄金。? ? ?