<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jbrg2008

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

    2008年1月8日 #

    String中三種加法的區別

    String中三種加法的區別

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

    posted @ 2008-01-09 08:19 翰林 閱讀(203) | 評論 (0)編輯 收藏

    Class.forName的含義

           Class.forName(xxx.xx.xx) 返回的是一個類, .newInstance() 后才創建一個對象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加載指定的類,也就是說JVM會執行該類的靜態代碼段

    Class aClass = Class.forName(xxx.xx.xx);
    Object anInstance = aClass.newInstance();
    這其中Class.forName("").newInstance()返回的是object

    例:
    Class Driver{
    protected static Driver current;
    public static Driver getDriver(){
    return current;
    }
    }

    Class MyDriver extends Driver{
    static{
    Driver.current=new MyDriver();
    }
    MyDriver(){}
    }

    用時:
    Class.forName("MyDriver");
    Driver d=Driver.getDriver();

    有的jdbc連接數據庫的寫法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),為什么會有這兩種寫法呢?

    在JDBC規范中明確要求這個Driver類必須向DriverManager注冊自己,即任何一個JDBC Driver的Driver類的代碼都必須類似如下:
    public class MyJDBCDriver implements Driver {
    static {
    DriverManager.registerDriver(new MyJDBCDriver());
    }
    }

    所以我們在使用JDBC時只需要Class.forName(XXX.XXX);就可以了,在JDBC驅動中,有一塊靜態代碼,也叫靜態初始化塊,它執行的時間是當class調入到內存中就執行(你可以想像成,當類調用到內存后就執行一個方法)。所以很多人把jdbc driver調入到內存中,再實例化對象是沒有意義的。

    posted @ 2008-01-08 08:25 翰林 閱讀(346) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 香蕉国产在线观看免费| 亚洲精品在线免费观看视频| 在线视频免费国产成人| 免费观看的毛片手机视频| 亚洲国产精品视频| 国产亚洲av片在线观看18女人| 亚洲无线码在线一区观看| 亚洲第一香蕉视频| 麻豆国产精品免费视频| 国产区卡一卡二卡三乱码免费| 中文字幕亚洲电影| 中文在线观看国语高清免费| 亚洲高清免费在线观看| 亚洲人成无码网WWW| 亚洲中文无码永久免费| 中国精品一级毛片免费播放| 亚洲日韩欧洲无码av夜夜摸| 日本免费久久久久久久网站| 午夜高清免费在线观看| 亚洲精品人成在线观看| 日韩在线视频播放免费视频完整版| 亚洲成a人无码av波多野按摩| 一个人免费观看www视频| 国内外成人免费视频| 免费大片av手机看片高清| 久久笫一福利免费导航| 亚洲日韩精品无码专区网址| 久久午夜夜伦鲁鲁片免费无码| 99亚洲精品高清一二区| 免费网站看av片| 狠狠色婷婷狠狠狠亚洲综合| 久久久久国色av免费看| 国产亚洲一区二区在线观看| 一级毛片免费不卡直观看| 亚洲国产女人aaa毛片在线| 国产精品无码免费播放| 亚洲AV成人无码天堂| 16女性下面无遮挡免费| 亚洲AV无码AV日韩AV网站| 成人午夜视频免费| 老司机亚洲精品影院在线观看|