離弦之Ray

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

          #

          Interfaces

          有兩種主要的Collection Types
          java.util.Map
          java.util.SortedMap
          java.util.Collection
          java.util.Set
          java.util.List
          java.util.SortedSet


          Implementations

          List的三種實(shí)現(xiàn)

          java.util.Vector
          java.util.ArrayList
          java.util.LinkedList

          三者的異同
          三者都是有序的,一般就是加入的次序。

                  VectorArrayList內(nèi)部都是用數(shù)組實(shí)現(xiàn)的,可以把它們想象成為一個(gè)數(shù)組。當(dāng)容量不夠的時(shí)候,就新建一個(gè)更大的數(shù)組,然后把現(xiàn)在這個(gè)數(shù)組中的所有元素都拷過去。可以想象這種實(shí)現(xiàn)可以很方便的直接取出你要的某個(gè)元素而不用遍歷。但是如果在中間刪除或者插入元素,效率就不高了。甚至每次擴(kuò)容的時(shí)候,都是很影響效率的時(shí)候。

                  VectorArrayList的區(qū)別就是Vector是線程安全的,但ArrayList不是。因?yàn)閷?shí)現(xiàn)線程安全是有代價(jià)的,如果應(yīng)用中不需要線程安全,那么就用ArrayList,如果需要線程安全那就一定要用Vector

          至于java中的LinkedList,其實(shí)在數(shù)據(jù)結(jié)構(gòu)中就是雙向鏈表。插入和刪除元素都很快,但是要查找一個(gè)元素就慢了。有失必有得,如何選擇,就看應(yīng)用的情況了。


          MapSortedMap的幾種實(shí)現(xiàn)

          java.util.HashTable
          java.util.HashMap
          java.util.IdentityHashMap
          java.util.WeakHashMap

                  以上四種都是無序的。HashTableHashMap的區(qū)別是HashTable是線程安全的而HashMap不是,這個(gè)關(guān)系有點(diǎn)像VectorArrayList

                  IdentityHashMap首先它是一個(gè)HashMap,不同的是,它不是根據(jù)equal()函數(shù)來判斷是否重復(fù),只要不是同一個(gè)對(duì)象,哪怕這兩個(gè)對(duì)象的數(shù)據(jù)都是一樣的,那么就可以add進(jìn)來。


          java.util.LinkedHashMap

          java.uil.TreeMap

                  以上兩種是有序的Map,可以進(jìn)行iterate,當(dāng)然這是要付出效率代價(jià)的。兩者不同之處,由名字便可知道,LinkedHashMap用鏈表來維護(hù)這個(gè)次序,而TreeMap是用二叉樹來維護(hù)這個(gè)次序。

          SetsSortedSets的幾種實(shí)現(xiàn)

          java.util.HashSet
          java.util.LinkedSet
          java.util.TreeSet

          由名字就可知道什么意思了,不多說了

          Collection的選擇

                  需要通過一個(gè)key找到一個(gè)元素嗎?
                  Yes,那就用Map
                  No,那就用Collection

                 如果選擇了一個(gè)Collection,允許重復(fù)元素嗎?
                 Yes,那就用List
                 No,那就用Set

                 然后就是決定要不要Sorted...這個(gè)就比較難決定了。
                 如果常常要sort,那就直接選擇sorted的類型
                 如果偶爾或者根本不需要sorted,那就選擇普通類型,需要sort的時(shí)候先拷到sorted的類型中sort一下。

          三種Iterators

          java.util.Enumeration

          這個(gè)基本被Iterator替代掉了,但在某些場(chǎng)合,比如J2ME中還可能用到。

          java.util.Iterator

          用的最廣泛

          java.util.ListIterator

          雙向的Iterator,必須用在實(shí)現(xiàn)ListCollection上面。


          PS很多Collection提供的是Fail-Fast Iterators,就是在iterater的時(shí)候,這個(gè)Collection是不能被更改的,否則就會(huì)報(bào)出ConcurrentModificationException在多線程環(huán)境下面尤其要注意。


          posted @ 2007-10-26 21:14 離弦之ray的技術(shù)天空 閱讀(759) | 評(píng)論 (0)編輯 收藏

          Final constrants

                 在編程中,用final變量來聲明一些常量,這樣就不用在每個(gè)用到這個(gè)常量數(shù)字的地方打入令人厭煩的復(fù)雜數(shù)字(比如PI),只要打入這個(gè)常量名字就行了。這大家都知道,可是要注意,這種常量是在編譯階段才被替換的(所謂替換,就是把程序中用到這個(gè)常量名字的地方,用常量本身來替代)。那意味著,如果其它類用到了這個(gè)常量,如果常量的值發(fā)生了更改,那用到這個(gè)常量的類必須重新build一下,否則那個(gè)類里還是以前的值。

                  如果在程序中你用到了private final static常量,并且只在某一個(gè)方法內(nèi)用到,那么你應(yīng)該把它的聲明移到方法以內(nèi)。如果被兩個(gè)以上的方法用到,那么還是留在類聲明里。

          移入方法內(nèi)部后,不用寫private關(guān)鍵字,而且程序看起來比較簡(jiǎn)單。


          Final Variables

          首先寫個(gè)例子

          public static String someMethod(final String environmentKey){

                     final String key = "env." + environmentKey;

                    System.out.println("Key is :" + key);

                     return (System.getProperty(key));

          }

                  在method中聲明的final變量和常量是不同的,不同之處在于method-scoped final variables are variable。每次進(jìn)入這個(gè)方法內(nèi)部,這個(gè)變量就被初始化一次。當(dāng)然,這些變量都是運(yùn)行時(shí)進(jìn)行替換,而不像常量是在編譯時(shí)進(jìn)行替換。


          Final Parameters

          將方法的parameters聲明成final,可以防止,在方法體內(nèi)部這個(gè)參數(shù)被篡改。很好的best practice


          Final Collections

                  public final static Set VALID_COLORS; 這句語句是不是聲明了一個(gè)final set?答案是NO。這只是聲明了一個(gè)final引用,也就是VALID_COLORS這個(gè)引用不能被更改。

                  如果重新聲明一個(gè)引用指向這個(gè)對(duì)象,那么這個(gè)對(duì)象還是能夠更改的,所以這并不是一個(gè)final set。那么怎樣做才能真正得到一個(gè)final set呢?

          public final static Set VALID_COLORS;

          static{

          Set temp = new HashSet();

          temp.add(Color.red);

          temp.add(Color.blue);

          ...

          VALID_COLORS = Collections.unmodifiableSet(temp);

          }

                  在實(shí)現(xiàn)自己的unmodifiable collections factory的時(shí)候,除了要實(shí)現(xiàn)Collectionseriallizable接口以外,對(duì)于Collection中定義的寫操作,要重載。方法體中可以簡(jiǎn)單地拋出UnsupportedOperationException異常。

          Instance-Scoped Variables

                  說白了,就是那些在對(duì)象被實(shí)例化的時(shí)候才被初始化的屬性,并且是不能被修改的。那么就把他聲明成final吧。

          exprivate final Date creationDate =

          Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();

          這么做的話,就可以防止誤操作,改變這個(gè)本來不應(yīng)該變的值。


          Final Classes

          ex:

          public final class SomeClass(){

          //...Class contents

          }

                  這樣的class 不能被繼承。

                  還有一種方法實(shí)現(xiàn),就是把它所有的構(gòu)造函數(shù)都改成private的。

                  這在設(shè)計(jì)模式中sigleton模式中見過,但這就限制了這個(gè)類的重用,所以取個(gè)折衷,可以把構(gòu)造函數(shù)聲明成protected的。


          Final Method

          這個(gè)很熟悉了,一個(gè)類中的某個(gè)方法如果被聲明成final的,那么這個(gè)類的子類是不能override這個(gè)方法的。


          Conditional Complilation

                  編程的時(shí)候我們常常會(huì)使用System.out.println(".....");來顯示一些程序的運(yùn)行情況,但在真正交付的時(shí)候,我們并不希望這些語句被編譯到class文件里面去。

                  一個(gè)做法是所有這種類型的語句前面加上一個(gè)if(booleanParameter),然后通過設(shè)置這個(gè)booleanParameter來實(shí)現(xiàn)要不要運(yùn)行這些語句,編譯器在編譯的時(shí)候如果發(fā)現(xiàn)if里面的語句不可達(dá),那么會(huì)將這些程序代碼直接去掉。

                  疑問就是這些booleanParameter放在哪里比較好和方便。作者給出的建議是在包中專門建一個(gè)類,里面存放這些靜態(tài)的boolean常量,當(dāng)然,命名的時(shí)候要仔細(xì)。名字要指出用在哪里。

          posted @ 2007-10-23 14:07 離弦之ray的技術(shù)天空 閱讀(298) | 評(píng)論 (0)編輯 收藏

          1.Java沒有指針?NoJava只是沒有針對(duì)指針的算法。引用其實(shí)已經(jīng)包含了指針。

          2.RTTI——Runtime type identification,作用就是告訴你整個(gè)object是屬于什么類型的。最常用的是getClass()方法。

          3.只在for循環(huán)中用到的變量,就在for循環(huán)中聲明和分配,不用擔(dān)心會(huì)循環(huán)分配內(nèi)存。

          比如:

          for(int i =0;i<10;i++){

          String s = a[i];

          }

          s并不會(huì)循環(huán)new,編譯器會(huì)處理,讓它只在第一次分配內(nèi)存。
          前面編程,我還特意把s移到外面去呢……汗啊

          4.switch語句中,如果在default語句中加一個(gè)break是完全沒有用的。因?yàn)樵谀莻€(gè)地方的break根本就不會(huì)被執(zhí)行。

          5.continue

          for(int idx=0;idx<1000,idx++){

          if(idx==555){continue;}

          }

          在這個(gè)例子中,循環(huán)僅僅跳過了555,如果程序中遇到類似要跳過某個(gè)點(diǎn)的情況,可以這么利用continue,會(huì)減少很多代碼。


          6.chaining constructor

          活用super()、this()等,來縮減構(gòu)造函數(shù)的復(fù)雜度。


          7.private for attributes

             public for public methods

             protected for helper methods


          8.In Java, instances of the same class are friends and give unrestricted access to all of their properties and methods.

          比如

          if((obj.value==5)&&(this.value==5)){

          obj.value=25;

          }

          這里面跳過了setter方法,直接給屬性賦值,這是很危險(xiǎn)的做法。解決的方法是無論什么方法給對(duì)象中的屬性賦值都要通過setter方法。


          9.對(duì)于問題代碼要盡量用throw exception告知用戶,因?yàn)橛袝r(shí)候不知道代碼的執(zhí)行環(huán)境,如EJB等等,很多環(huán)境都是沒有Console的,若是簡(jiǎn)單的System.out.println 可能解決不了問題。

          posted @ 2007-10-22 10:15 離弦之ray的技術(shù)天空 閱讀(383) | 評(píng)論 (0)編輯 收藏

           

          JDBC 主要有兩種方法

          DriverManager機(jī)制:java.sql核心API

          DataSource機(jī)制:javax.sql可擴(kuò)展API

          DriverManager機(jī)制:

          stetp1:注冊(cè)驅(qū)動(dòng)程序

          1)隱式注冊(cè)Class.forName("JDBCDriverName");

          2)顯示注冊(cè)DriverMnager.registerDriver(new JDBCDriverName());

          step 2:建立數(shù)據(jù)庫連接

          Connection conn = DriverManager.getConnection(URL,username,password);

          //其中URLjdbc:driver:databasename

          step3:SQL操作

          DataSource機(jī)制

          step1:查詢數(shù)據(jù)源對(duì)象

          Context ctx = new InitialContext();

          DataSource ds = (DataSource)ctx.lookup(DataSourceJNDIName);

          step2:獲取數(shù)據(jù)庫連接

          Connection con = ds.getConnection();

          step3SQL操作

          SQL操作

          1)使用Statement

                Statement stmt = con.createStatement();

                stmt.executeUpdate("SQL語句");

                stmt.close();

          2)使用PreparedStatement

                例子

                PreparedStatement psmt = conn.preparedStatement("INSERT INTO employee                                                  VALUES(?,?,?)");

                 psmt.setString(1,"Benjamin");

                 psmt.setString(2,"France");

                 psmt.setInt(3,55);

                 int opNum = psmt.executeUpdate();

                 還可以批量處理

                 psmt.setString(1,"Benjamin");

                 psmt.setString(2,"France");

                 psmt.setInt(3,55);

                 psmt.addBatch();

                 psmt.setString(1,"Rob");

                 psmt.setString(2,"America");

                 psmt.setInt(3,56);

                 psmt.addBatch();

                 int [] updateCounts = psmt.executeBatch();

          關(guān)于ResultSet

          ResultSet rs = stmt.executeQuery("SQL");

          next()——移到下一行,如果沒有了則返回false。常常放在while(rs.next)用來循環(huán)取數(shù)據(jù)

          getString(String ColumnName)

          absolute(int row)

          beforeFist()

          isAfterLast()

          isBeforeFirst()

          isFirst()

          isLast()

          refreshRow()

          關(guān)于元數(shù)據(jù)

          所謂元數(shù)據(jù)就是描述數(shù)據(jù)的數(shù)據(jù),這里當(dāng)然指列名等等信息了

          ResultSetMetaData rsmd = rs.getMetaData();

          rsmd.getColumnCount();

          rsmd.getColumnName(index);

          posted @ 2007-10-21 18:41 離弦之ray的技術(shù)天空 閱讀(319) | 評(píng)論 (0)編輯 收藏

                  作為j2ee小菜鳥,初次遭遇JNDI還是在大三的時(shí)候,當(dāng)時(shí)學(xué)院搞j2ee實(shí)訓(xùn),我們還沒搞清楚servletJSP就依葫蘆畫瓢的搞Struts了。所以在配置mysqlds.xml的時(shí)候完全不知道在配置DataSource,現(xiàn)在知道這就是在使用JNDI。網(wǎng)上查了幾個(gè)網(wǎng)頁,拼拼湊湊,模模糊糊地理解了:

                  JNDI——Java Naming and Directory InterfaceTM

                 直接翻譯就是Java命名和目錄接口,實(shí)現(xiàn)這個(gè)接口,提供的是一個(gè)服務(wù),這是個(gè)什么樣的服務(wù)呢?

                 首先在連接數(shù)據(jù)庫的時(shí)候(我使用的是mysqljboss4.0),我們會(huì)用到Context這個(gè)類,context是一套name-to-object的綁定,可以理解為層次或目錄,他可以包括下一層subContext。在使用命名和目錄服務(wù)時(shí)獲得initial context 是對(duì)整個(gè)名字空間操作的入口。

                 針對(duì)Datasource而言,說白了,就是給你的數(shù)據(jù)庫連接(注意,是數(shù)據(jù)庫連接Connection這個(gè)對(duì)象,不是數(shù)據(jù)庫)起個(gè)簡(jiǎn)單易懂的名字,你在程序中直接調(diào)用這個(gè)名字,就得到這個(gè)連接的對(duì)象,而具體的生成和管理就靠服務(wù)器了。

                通常會(huì)形成一個(gè)connection pool,動(dòng)態(tài)的來管理這些對(duì)象以節(jié)省資源。

                這樣,如果項(xiàng)目移植到其它數(shù)據(jù)庫或者服務(wù)器什么的,只要配置服務(wù)器就行了。配置比如這個(gè)連接用什么JDBC驅(qū)動(dòng)啊,用戶名和密碼啊等等。程序代碼可以不作改動(dòng)。這里的DataSource不一定就是數(shù)據(jù)庫連接,還可以是其它比如文件連接等等。


               其實(shí)EJB都是靠JNDI得到EJB objectreference的,具體的機(jī)理是不太了解,不過就是那個(gè)意思,初學(xué)者這樣理解應(yīng)該就夠了。


              今天郁悶了半天,在jboss里面配置JNDI DataSource,想看看如果外面直接用普通的Java工程能不能連接數(shù)據(jù)庫,答案是否。后來想通了。服務(wù)器提供JNDI服務(wù)所使用的類,這個(gè)普通的工程又不知道在哪,當(dāng)然搞不起來。而Web工程和EJB工程因?yàn)榘l(fā)布到服務(wù)器下面的目錄的,所以能使用JNDI服務(wù)。


              這是我的理解,請(qǐng)各位高手指點(diǎn)。


             至于JBoss等等服務(wù)器怎么配置,網(wǎng)上搜一下,有很多牛人總結(jié)的,這里就不重復(fù)了。


          posted @ 2007-10-15 21:54 離弦之ray的技術(shù)天空 閱讀(329) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共11頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 Last 
          主站蜘蛛池模板: 高阳县| 大足县| 东丰县| 习水县| 万安县| 德江县| 九龙城区| 抚顺市| 兰西县| 乌拉特后旗| 乌鲁木齐市| 承德县| 永昌县| 清新县| 望都县| 洛浦县| 石首市| 海兴县| 西峡县| 泽普县| 东辽县| 资兴市| 楚雄市| 大城县| 土默特右旗| 玛曲县| 忻州市| 伊金霍洛旗| 博白县| 岳池县| 湄潭县| 雷州市| 德昌县| 梅州市| 建宁县| 大田县| 元氏县| 商洛市| 林州市| 乌拉特后旗| 南和县|