jbrg2008

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

          2008年1月9日 #

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

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

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

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

          2008年1月8日 #

          Class.forName的含義

                 Class.forName(xxx.xx.xx) 返回的是一個(gè)類, .newInstance() 后才創(chuàng)建一個(gè)對象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加載指定的類,也就是說JVM會(huì)執(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(){}
          }

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

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

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

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

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

          2008年1月4日 #

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

          1.RequestDispatcher.forward()

          是在服務(wù)器端起作用,當(dāng)使用forward()時(shí),Servlet engine傳遞HTTP請求從當(dāng)前的Servlet or JSP到另外一個(gè)Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時(shí)form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動(dòng)傳遞.但forward ()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無法在后面帶參數(shù)傳遞,比如 servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute("name",name)來傳至下一個(gè)頁面.重定向后瀏覽器地址欄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傳至下個(gè)頁面,同時(shí)它可以重定向至不同的主機(jī)上,且在瀏覽器地址欄上會(huì)出現(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 翰林 閱讀(184) | 評(píng)論 (0)編輯 收藏

          淺析final,abstract修飾符

          1.final修飾符

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

          2.抽象類

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

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

          2008年1月3日 #

          Dao類中的方法是寫成static好,還是實(shí)例方法好?

                  最近在編寫代碼過程中,總會(huì)寫到操作數(shù)據(jù)庫的確DAO類,這些類都是用在servlets中,操作數(shù)據(jù)頻繁,我是想問一下各位看了這個(gè)文章的大哥們,你們在寫這些類的時(shí)候,會(huì)考慮到這樣的問題不?到底是寫成static的方法好呢,還是寫成實(shí)例的方法
                  要是寫成靜態(tài)的方法,會(huì)不會(huì)在多線程中產(chǎn)生異常呢?而寫成實(shí)例的,得要每次都new 一個(gè)新的實(shí)例
                  看了這個(gè)文章的朋友寫下自己想法,謝謝!!

          posted @ 2008-01-03 08:31 翰林 閱讀(1609) | 評(píng)論 (5)編輯 收藏

          2008年1月1日 #

          JAVA魔法數(shù)值

          說明:所謂魔法數(shù)值,是指在代碼中直接出現(xiàn)的數(shù)值,只有在這個(gè)數(shù)值記述的那部分代碼中才能明確了解其含義。

            魔法數(shù)值使代碼的可讀性大大下降。而且,如果同樣的數(shù)值多次出現(xiàn)時(shí),到底這些數(shù)值是不是帶有同樣的含義呢,誰也說不清楚。另一方面,如果本來應(yīng)該使用相同數(shù)值的地方,一旦用錯(cuò)了,也很難發(fā)現(xiàn)。因此,需要注意以下幾點(diǎn),極力避免使用魔法數(shù)值。

            ① 不使用魔法數(shù)值,代之以有名字的Static final或者enum值

            在Java語言中,對有名字的值的定義,可以使用用Static final或者enum來聲明的值

            注意(命名方法):在取名時(shí)一定要注意增加名字的信息量。比如,為16命名為SIXTEEN是沒有意義的。

            如果16表示的是價(jià)格表的一個(gè)元素,則應(yīng)該命名為PRICE_TABLE_MAX。關(guān)于命名規(guī)則,還要參照本小冊子的第6條。

            ② 原則上,數(shù)值就是魔法數(shù)值

            但是,0,作為數(shù)組的最小下標(biāo)是經(jīng)常使用的。

            例:for( int i = 0; I < table.leERRORth(); i++ )

            讀到這里,讀者都會(huì)認(rèn)為這里的0是數(shù)組的最小下標(biāo),所以在這里不認(rèn)為0是魔法數(shù)值。

            另外,0經(jīng)常被作為變量初始化的缺省值,這時(shí)候一般也不認(rèn)為0是魔法數(shù)值。

            通過使用有名字的值,一方面可以提高代碼的可讀性,另一方面,也可以把變更的地方局部化,從而提高可維護(hù)性。

            例子:

            魔法數(shù)字的例子

            int priceTable[] = new int[16]; //ERROR:這個(gè)16究竟有何含義呢?

            使用了帶名字的數(shù)值的例子

            static final int PRICE_TABLE_MAX = 16; //OK:帶名字

            int price Table[] = new int [PRICE_TABLE_MAX]; //OK:名字的含義是很清楚的

          posted @ 2008-01-01 16:24 翰林 閱讀(337) | 評(píng)論 (1)編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 红桥区| 盐亭县| 安图县| 尼玛县| 白河县| 衡东县| 库车县| 郯城县| 古浪县| 珲春市| 信阳市| 南溪县| 肃北| 海兴县| 彰武县| 靖江市| 且末县| 新竹县| 屏东市| 深圳市| 宜阳县| 通化市| 泾阳县| 灵璧县| 南和县| 邻水| 林口县| 桑植县| 和林格尔县| 扎兰屯市| 普安县| 上蔡县| 独山县| 涿鹿县| 丽水市| 岳阳市| 鹤山市| 陇川县| 武功县| 甘德县| 尼玛县|