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

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

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

    jbrg2008

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

    2008年1月4日 #

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

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

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

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

    Class.forName的含義

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

    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連接數(shù)據(jù)庫的寫法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),為什么會有這兩種寫法呢?

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

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

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

    比較jsp中forword和sendRedirect的區(qū)別

    1.RequestDispatcher.forward()

    是在服務(wù)器端起作用,當(dāng)使用forward()時,Servlet engine傳遞HTTP請求從當(dāng)前的Servlet or JSP到另外一個Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動傳遞.但forward ()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時forward()無法在后面帶參數(shù)傳遞,比如 servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute("name",name)來傳至下一個頁面.重定向后瀏覽器地址欄URL不變.

    例:servlet文件中重定向
    public void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException
    {
           response.setContentType("text/html; charset=gb2312");
           ServletContext sc = getServletContext();
           RequestDispatcher rd = null;
           rd = sc.getRequestDispatcher("/index.jsp");
           rd.forward(request, response);
    }

    2.response.sendRedirect()

    是在用戶的瀏覽器端工作,sendRedirect()可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個頁面,同時它可以重定向至不同的主機上,且在瀏覽器地址欄上會出現(xiàn)重定向頁面的URL.sendRedirect()可以重定向有frame的jsp文件.

    例:servlet文件中重定向

    public void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException
    {
           response.setContentType("text/html; charset=gb2312");
           response.sendRedirect("/index.jsp");
    }

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

    淺析final,abstract修飾符

    1.final修飾符

            有時候,你不希望別人坐享其成,通過繼承你寫的類得到他自己所需要的類,怎么辦呢?這個時候你就可以在你的class之前加上final這個修飾府,例如public final class test{……},加上了這個修飾符之后,別人在繼承這個類的話就會編譯出錯,提示他這個類不能構(gòu)建子類。從這我們可以看出,final修飾符和abstract修飾符是不能同時使用的,因為abstract類可以說是專門用來繼承的,而final類則不能用于繼承。那么如果是在方法的前面加上final修飾符有什么作用呢?比如說A類中有個聲明為final的方法a(){….},那么B繼承A的時候,B就不能覆蓋方法a(){….},否則編譯出錯,提示Cannot override the final method from A。此外,如果一個類聲明為final類的話,它里面所有的方法都自動成為final類型的。自然的,你肯定會問,如果一個域申明為final的時候有什么作用?一個屬性聲明為final之后,你不能在對它重新進行賦值,否則編譯報錯,The final field ×× cannot be assigned。另外,請注意,類聲明為final的時候,僅僅它的方法自動變?yōu)閒inal,而屬性則不會。

    2.抽象類

    抽象類的用處是十分大的,特別是對于OOP而言,關(guān)于抽象類,總結(jié)幾點:
    a.  抽象類不能實例化,即不能對其用new運算符;
    b.  類中如果有一個或多個abstract方法,則該類必須聲明為abstract;
    c.  抽象類中的方法不一定都是abstract方法,它還可以包含一個或者多個具體的方法;
    d.  即使一個類中不含抽象方法,它也可以聲明為抽象類;

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

    主站蜘蛛池模板: 成人免费AA片在线观看| 久久国产乱子免费精品| 最近中文字幕mv免费高清电影| 亚洲丝袜美腿视频| 黄页网站在线观看免费高清| 亚洲精品在线播放视频| 操美女视频免费网站| 亚洲综合亚洲国产尤物| 国产小视频在线观看免费| 久久国产乱子伦精品免费不卡| 亚洲aⅴ无码专区在线观看| 亚洲av无码国产精品色午夜字幕| 天天看片天天爽_免费播放| 91免费福利视频| 亚洲av无码专区国产不乱码| 亚洲天堂一区二区| 亚洲Av无码国产情品久久| 成人免费在线看片| 免费无码黄网站在线看| 国产精品亚洲综合网站| 91亚洲va在线天线va天堂va国产 | 国产亚洲一卡2卡3卡4卡新区| 久久精品国产亚洲AV果冻传媒| 国产男女性潮高清免费网站| 久久精品无码专区免费青青| 久草免费福利在线| 国产亚洲一卡2卡3卡4卡新区| 亚洲中文字幕在线无码一区二区| 国产中文在线亚洲精品官网| 日韩在线视频免费看| 亚洲一区免费在线观看| 免费播放在线日本感人片| 无忧传媒视频免费观看入口| 亚洲AV男人的天堂在线观看| 伊人久久综在合线亚洲2019| 亚洲精品乱码久久久久久中文字幕 | 国产成人 亚洲欧洲| 亚洲一区二区三区成人网站| 亚洲视频在线观看地址| 国产亚洲欧洲精品| 亚洲真人无码永久在线|