jbrg2008

          人以銅為鏡,可以正衣冠;以古為鏡,可以見(jiàn)興替;以人為鏡,可以知得失.

          String中三種加法的區(qū)別

          String中三種加法的區(qū)別

          JAVA的確是一種令程序員陷入兩難境地的語(yǔ)言, 確切的說(shuō)是思想. 它提供了如此豐富的library,讓程序員能夠很容易的寫(xiě)出功能強(qiáng)大的程序. 同時(shí)它也封裝了如此多的細(xì)節(jié), 讓程序員能夠輕易的寫(xiě)出很拙略的程序. 它所代表的object指向思想設(shè)計(jì)之初是為了把程序員從紛繁復(fù)雜的編程細(xì)節(jié)中解放出來(lái),來(lái)達(dá)到對(duì)已有程序的利用. 但是在編程 實(shí)際上又要求程序員了解其實(shí)現(xiàn)的細(xì)節(jié)而避免寫(xiě)出因調(diào)用已有l(wèi)ibrary不正引起的performance慢的,耗費(fèi)系統(tǒng)資源多的程序.通常成為一個(gè)優(yōu)秀的JAVA程序員需要較長(zhǎng)時(shí)間的經(jīng)驗(yàn)積累,包括從程序的tuning中,或從其他有經(jīng)驗(yàn)的程序員口中,才知道一定功能需要怎樣實(shí)現(xiàn),在程序中需要避免那些問(wèn)題.但這往往是比較片面的,知其然而不知其所以然.我想大多數(shù)程序員都有類(lèi)似的經(jīng)歷,舉一個(gè)簡(jiǎn)單的例子,下面有三種對(duì)String的累加操作. 
          ① String tmp = "a" + "b" + "c"; 
          ② String tmp = null; 
                   tmp+= "a"; 
                   tmp+= "b"; 
                   tmp+= "c"; 
          ③ String tmp = null; 
                   StringBuffer buf = new StringBuffer(); 
                   buf.append("a"); 
                   buf.append("b"); 
                   buf.append("c"); 
                   tmp = buf.toString(); 
          有些JAVA程序員在任意的用這三種方法的任一種,無(wú)視它們的區(qū)別.有 些程序員知道第三種方法好一直在用而不知其為什么好,以至于作為 
          經(jīng)驗(yàn)教條的傳授給JAVA新手.真正的答案是什么呢?讓我們揭開(kāi)JAVA String Class和StringBuffer Class的封裝面紗看看它的內(nèi)部實(shí)現(xiàn).在JAVA中的String Class是一個(gè)不可變類(lèi),所有對(duì)一個(gè)Sting Object的改變都會(huì)導(dǎo)致一個(gè)新的String Object的生成.那么對(duì)tmp+=a中+符號(hào)的實(shí)現(xiàn)呢?如果你注意一下StringBuffer的Javadoc會(huì)發(fā)現(xiàn).JDK對(duì)它的實(shí)現(xiàn)是tmp=(new StringBuffer().append(tmp).append("a")).toSting(); 這樣我們發(fā)現(xiàn)②這種方法在隱性生成了一個(gè)StringBuffer Object和一個(gè)String Object 再乘3就是六個(gè)object 的資源耗費(fèi).(還不包括String Class 和StringBuffer Class內(nèi)部使用的Char[])而方法③只用了兩個(gè).也許有些程序員會(huì)對(duì)這些耗費(fèi)不以為然,的確也是,不過(guò)在一些場(chǎng)景下它會(huì)成為perfamence的瓶頸.再回頭看看①這種方法,它會(huì)被JAVA編譯器編譯為tmp=(new StringBuffer().append("a").append("b").append("c")).to String();我們發(fā)現(xiàn)做的和③方法是同樣的事.

          posted on 2008-01-09 08:19 翰林 閱讀(206) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2SE綜合


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 沙田区| 黔西| 临朐县| 安国市| 抚松县| 贡觉县| 张北县| 明溪县| 东方市| 花莲市| 宁海县| 长春市| 宁波市| 兴安盟| 平定县| 贵南县| 蓝田县| 信宜市| 屏南县| 本溪市| 天峻县| 登封市| 阿拉善左旗| 合川市| 苏州市| 华宁县| 兴化市| 西和县| 建阳市| 开远市| 白山市| 阳西县| 榆林市| 嘉善县| 平果县| 宣汉县| 阿坝县| 昌都县| 墨竹工卡县| 安平县| 阿拉善右旗|