jbrg2008

          人以銅為鏡,可以正衣冠;以古為鏡,可以見興替;以人為鏡,可以知得失.

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

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

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

          posted on 2008-01-09 08:19 翰林 閱讀(207) 評論(0)  編輯  收藏 所屬分類: J2SE綜合


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


          網站導航:
           
          主站蜘蛛池模板: 河间市| 肇庆市| 新龙县| 乐平市| 搜索| 康定县| 东乌珠穆沁旗| 绩溪县| 揭阳市| 鹤岗市| 桐庐县| 潜山县| 连城县| 老河口市| 弥渡县| 红原县| 瑞丽市| 错那县| 凤冈县| 公安县| 民权县| 太和县| 都安| 扶绥县| 文昌市| 乌拉特后旗| 隆化县| 全州县| 岱山县| 马关县| 瑞安市| 万州区| 出国| 博爱县| 德令哈市| 湖州市| 五莲县| 黔西县| 彭阳县| 芮城县| 巴彦淖尔市|