Using Kettle for more than one year in my project, but still have no time to read the source code of Kettle untill couple of days before (busy or actually lazy?). Yeah, I am a lazy dog...
Since the source code is not available directly from the Pentato website, I had no choice but to go thru some posts on the Pentaho forum one by one. It didn't take me much effor before I found the relevant post, thx god:) The source code of Kettle now is maintained in SVN of JavaForge, and anybody "can get the latest(subversion trunk) code changes with on this URL: http://svn.javaforge.com/svn/Kettle/trunk", the username is "anonymous" and password is "anon".
Besides, I had to download a SVN tool. I am using TortoiseSVN in my company, and the ux satisfied me, so I chose it again.
It taked about 30 minutes to check out all the source code (still very fast I think, my bandwidth is 2M).
When it done, I imported it as a general project into eclipse, and one thing surprised me a little bit was that, I didn't have to compile the source code or import some jars even than execute a Ant target manually as I built the source code of Spring before. Hah, Kettle is developed by using eclipse?! (you can find some eclipse project files in the trunk).
Anyway, the work was going on smoothly, no more than 40 minutes. Now I can debug the Kettle, and from my experience, in some scenarios Kettle doesn't work in good performace than I expect, and even sometimes it runs into some bugs when I do the multitudinous insert or update operations. Here I get the opportunity to look into the code and figure out the problem.
Keep moving forward...
集合類
集合類的對象是用來管理其他若干對象的,它類似于C++標(biāo)準(zhǔn)模板庫中的容器,不過在JAVA的集合類的對象中可以用來存放多種類型的對象。
接口和類共同構(gòu)成了一個集合框架,集合的概念,一個對象可以裝載多個對象,這個對象就是集合對象。
集合框架
1,接口
Collection 用來管理多個對象,集合中的每個元素都是對象。
Map,Map中沒有對象,而是鍵值對,由Key,value組成的鍵值對,Key是不可重復(fù)的。value是可以相同的,一個Key和一個value一一對應(yīng)。
集合中用到的類,接口在java.util包中,在使用時注意將其引入import。
Collection 接口(以下介紹其子接口)
1)List 一個List的實(shí)現(xiàn)類的對象在管理多個對象時會按順序組織對象(即按照將對象放入的順序存儲),List實(shí)現(xiàn)類的對象是由順序的。(注意,順序和排序的區(qū)別)
2)Set 一個Set的實(shí)現(xiàn)類表示一個數(shù)學(xué)概念上的集合,
Set的實(shí)現(xiàn)類的對象中的元素是無順序的,也就是不會按照輸入順序來存放,Set的實(shí)現(xiàn)類對象中的元素是不重復(fù)的。
3)SortedSet,他是Set的子接口,他的實(shí)現(xiàn)類會對集合中的元素進(jìn)行排序。但是要指定排序規(guī)則,他會按排序規(guī)則進(jìn)行排序。
Map 接口(以下介紹其子接口)
SortedMap,這個接口的實(shí)現(xiàn)類同樣可以實(shí)現(xiàn),不過是對鍵值對中的Key進(jìn)行排序,這個接口的實(shí)現(xiàn)類也是要指定排序規(guī)
則的。
JDK1.4中的集合是不安全的對象,JDK5.0中解決了這個問題。
List接口的實(shí)現(xiàn)類
1> ArrayList是接近于功能的集合類,
ArryList的實(shí)質(zhì)就是一個會自動增長的數(shù)組,ArrayList是用封裝的數(shù)組來實(shí)現(xiàn)的List接口的。Collection的實(shí)現(xiàn)類對象的遍歷方式是用迭代來實(shí)現(xiàn)的。
在使用迭代器時先要活得一個迭代器的對象,Iterator(迭代器接口)這是一個接口,迭代器是在集合類中實(shí)現(xiàn)的,也
就是說,他是一個內(nèi)部類(匿名內(nèi)部類)實(shí)現(xiàn)的。
Iterator接口中定義的常用方法方法hasNext(),next()。
hasNext(),這個方法會使用一個游標(biāo),并通過判斷游標(biāo)指向的位置是否存放有對象。
next()方法也是Iterator接口中定義好的方法,這個方法會使游標(biāo)指向下一個元素的位置,游標(biāo)會跳過第一個元素,并
返回其中的內(nèi)容。
Collections 這是一個工具類,也是java.util包中的,這個類中的sort(list接口的實(shí)現(xiàn)類的對象)方法,其參數(shù)是一個集合類的對象,這個方法使用來對集合類的對象進(jìn)行排序的。以后,我將以集合這個名字來稱呼集合類的對象。,對于
字符串對象內(nèi)容的集合來說會按字典順序排序(升序),對于數(shù)字內(nèi)容的集合排序也會按照升序排序。
排序可一份為兩部分內(nèi)容,一個是排序的規(guī)則,也就是按照什么來進(jìn)行排序,并且排成什么樣的順序。
第二個就是排序的算法,他決定了排序的效率。
在對自定義的集合內(nèi)容類型排序時,需要先定義那個類型的排序規(guī)則。
Comparable接口,這個接口中只定義了一個compareTo(Object o),方法的返回至類型是整型,如果當(dāng)前對象大于參數(shù)對象就返回正數(shù),當(dāng)前對象等于參數(shù)對象是就返回0,當(dāng)前對象小于參數(shù)對象時就返回負(fù)值,這樣寫就是升序排列,反之則是進(jìn)行降序排列,在實(shí)現(xiàn)這個接口中的方法時,返回值定義方式,只有這兩種。
根據(jù)指定類型的排序規(guī)則實(shí)現(xiàn)了Comparable接口,那么就可以對存有這個類型的集合進(jìn)行整體排序。Comparable接口,
也叫做可比較接口。這個接口在java.lang包下。
只要實(shí)現(xiàn)了這個接口,就是可排序的。
接下來介紹
另外一種對自定義類型對象的集合整體排序的方法,
也就是實(shí)現(xiàn)比較器接口(Comparator),這個接口中定義了一個compare(Object o1,Object o2)方法來比較兩個對象,這個方法的返回值定義和上面介紹的那個方法是一樣。注意:在API,幫助文檔中
以上兩個方法的參數(shù)類型是T,這代表的模板類型,也就是集合中存放的內(nèi)容的類型,在JDK1.4中其參數(shù)就是Object類型,模板類型的詳細(xì)內(nèi)容會在最后的JDK5.0新特性中講到。
Comparator接口可以在匿名內(nèi)部類中實(shí)現(xiàn),Collections 中的sort(集合了的對象,比較器)方法,可以對自定義類型內(nèi)容的集合進(jìn)行整體排序。
2>LinkedList,它是List接口的實(shí)現(xiàn)類,
其底層是用雙向循環(huán)鏈表來實(shí)現(xiàn)的。
注意:ArrayList的查詢效率比較高,增刪動作的效率比較差,適用于查詢比較頻繁,增刪動作較少的元素管理的集合。
? ? ?
LinkedList的查詢效率低,但是增刪效率很高。適用于增刪動作的比較頻繁,查詢次數(shù)較少的元素管理集合。
ArrayList,LinkedList都是線程不安全的。
實(shí)現(xiàn)堆棧 1,數(shù)組(ArrayList,增刪效率比較低,不適合)
? ? ? ? 2,
LinkedList(實(shí)現(xiàn)堆棧的好方法)? ? ? ? 3,java.util.Stack類,Stack是Vector的子類,Vector類是一個線程安全的(是一個重量級的類),并繼承
了Vector的方法,Verctor類和ArrayList的功能近乎相同。(不推薦使用Stack類來
實(shí)現(xiàn)堆棧)。
Set接口的實(shí)現(xiàn)類
HashSet
Set的實(shí)現(xiàn)類的集合對象中不能夠有重復(fù)元素,HashSet也一樣他是使用了一種標(biāo)識來確定元素的不重復(fù),HashSet用一種算法來保證HashSet中的元素是不重復(fù)的,
HashSet的底層實(shí)現(xiàn)還是數(shù)組。
Object類中的hashCode()的方法是所有子類都會繼承這個方法,這個方法會用Hash算法算出一個Hash(哈希)碼值返回,HashSet會用Hash碼值去和數(shù)組長度取模,模(這個模就是對象要存放在數(shù)組中的位置)相同時才會判斷數(shù)組中的元素和要加入的對象的內(nèi)容是否相同,如果不同才會添加進(jìn)去。
Hash算法是一種散列算法。
注意:
所以要存入HashSet的集合對象中的自定義類必須覆蓋hashCode(),equals()兩個方法,才能保證集合中元素容不重復(fù)。在覆蓋和hashCode()方法時,要使相同對象的hashCode()方法返回相同值,覆蓋equals()方法再判斷其內(nèi)容。為了保證效率,所以在覆蓋hashCode()方法時,也要盡量使不同對象盡量返回不同的Hash碼值。
如果數(shù)組中的元素和要加入的對象的hashCode()返回了相同的Hash值(相同對象),才會用equals()方法來判斷兩個對象的內(nèi)容是否相同。
SortedSet接口是Set的子接口。
TreeSet是SortedSet接口的實(shí)現(xiàn)類,他可以對集合中的元素進(jìn)行排序。
要存放在TreeSet中自定義類的對象,這個類要么是已經(jīng)實(shí)現(xiàn)了Comparable接口,要么是能給出Comparator比較器,TreeSet可以自動過濾掉重復(fù)元素所以不用重載hashCode()方法,TreeSet會根據(jù)比較規(guī)則判斷元素內(nèi)容是否相同,TreeSet會在元素存入世就進(jìn)行了排序。(在TreeSet給出排序規(guī)則時,一定要注意對象內(nèi)容相等的條件,一定要注意在主觀的認(rèn)為兩個對象內(nèi)容相同時,才可以使用比較少的條件來進(jìn)行判斷)
在
要排序時才使用TreeSet類(存儲效率比較低),HashSet的存儲效率比較高,在需要為HashSet的對象排序時,就可以把HashSet中的元素放入TreeSet。
通向財富的道路有千萬條,但條條道路都驚人地相似。而且令人詫異的是,拼命積累財富的男人也驚人地相似,他們在心理特征上就像是同一個模子壓出來的一樣。
??? 百萬富翁有諸多特征,絕大多數(shù)白手起家的百萬富翁都是出身貧窮的人,積累金錢對于那些一貧如洗的人有著不可抗拒的力量。
??? 這些男人是很有冒險精神的,他們敢于冒那些腳踏實(shí)地、像苦工似地掙錢的男人所不敢涉足的風(fēng)險。他們是精明強(qiáng)干的,他們很有遠(yuǎn)見卓識;他們的天才在于能知道如何利用別人的主意來賺錢。這是賺錢的真正秘訣——利用別人創(chuàng)造性的思想,并且把它們運(yùn)用到實(shí)際中去。
??? 這樣的男人很容易和別人打成一片。他們很有洞察力,他們會觀察別人,知道如何通過與別人打交道來獲得他們所需要的東西,也知道別人對他們的反應(yīng)如何。追求財富的人內(nèi)心深處有著強(qiáng)烈的孤獨(dú)感,但他們并不因此而去追求政治上的名望和成就。賺錢是他們絕對全神貫注的追求。這給他們勝于一切的最大滿足和快樂。
??? 1、讓金錢成為你的情人。
??? 別在性愛上浪費(fèi)時間和精力,你會發(fā)現(xiàn),從長遠(yuǎn)來看,賺錢比性愛更讓人興奮,這可不是空頭支票。尋求需求,滿足需求。追求財富者的最大天分是瞄準(zhǔn)時機(jī),預(yù)測所需。大眾牌小汽車,美國快餐食品都是滿足人們需要的例子。
??? 2、謹(jǐn)防從眾心理。
??? 群眾心理弊病多,即使它是正確的,追隨它一般也沒有什么利潤。在一般情況下,摘取經(jīng)濟(jì)精華的都是帶頭人而不是追隨者。
??? 3、當(dāng)雇主而不是雇員。
??? 那些滿足于雇主付給他們高薪的男人并不是真正追求財富的人,他們的目標(biāo)僅僅是成就感或權(quán)力欲。你最好去當(dāng)老板,即使雇員只有你一個,賺的錢也會比任何一個公司付給你的多。
??? 4、發(fā)展你的支配技巧。
??? 大多數(shù)人認(rèn)為,支配別人,讓他們?nèi)プ瞿阆胱屗麄兏傻氖虑榉浅毫印H欢瑢?shí)際情況是,我們時時都在自己沒有意識到的情況下支配著別人。
??? 5、追求財富的人常常是直覺地支配著別人,而且是個行家里手。
?
????????下午答辯,還算順利,雖然花了半天時間,沒任何技術(shù)含量,但是終于解脫了...
?????????五天來平均每天也就睡了不到兩小時,現(xiàn)在真有點(diǎn)頂不住了(意識都模糊了),但是為了把生物鐘調(diào)整過來,還是撐一會吧。突然閑下來卻不知道做點(diǎn)什么,20號有個面試,等會沒事把Struts那本書再看看。
?????????接下來都不知道寫些什么東西,就把實(shí)踐中的一個弄明白的一個小知識記一下:
在JDBC中,對于游標(biāo)對象ResultSet的getString()方法也是用游標(biāo)的模式來讀取數(shù)據(jù)的(不知道這樣描敘對不對),即,你要取字段1,字段2,就必須先調(diào)用rs.getString(1),再調(diào)用rs.getString(2),不能反過來,否則不能正確讀取。原因還不知道,有空了研究一下。