我的JAVA窝! - BlogJava

2007年1月1日

Got Source Code of Kettle

  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...

posted @ 2008-09-15 18:24 J2S 阅读(1591) | 评论 (3)编辑 收藏

集合框架类笔记的补充

java .util.*定义了一系列的接口和类,告诉我们用什么类NEW出一个对象,可以进行超越数组的操作。
(注:JAVA1.5对JAVA1.4的最大改进就是增加了对范型的支持)

Set接口是数学中集合的概念:其元素无序,且不可重复。(正好与List对应)

!!注意数组和集合的区别:数组中只能存简单数据类型。Collection接口和Map接口只能存对象。

只有List可用get和size。而Set则不可用(因其无序)。

集合中每一个元素都有对象,如有字符串要经过强制类型转换。

Collections是工具类,所有方法均为有用方法,且方法为static。


Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。
规则用来判断对象;算法是考虑如何排序。
对于自定义对象,Sort不知道规则,所以无法比较。这种情况下一定要定义排序规则。方式有两种:
java.lang下面有一个接口:Comparable(可比较的)
可以让自定义对象实现一个接口,这个接口只有一个方法comparableTo(Object o)
其规则是当前对象与o对象进行比较,其返回一个int值,系统根据此值来进行排序。
如 当前对象>o对象,则返回值>0;(可将返回值定义为1)
如 当前对象=o对象,则返回值=0;
如 当前对象<o对象,则返回值〈0。(可将返回值定义为-1)
看TestArraylist的java代码。
我们通过返回值1和-1位置的调换来实现升序和降序排列的转换。

java.util下有一个Comparator(比较器)
它拥有compare(),用来比较两个方法。
要生成比较器,则用Sort中Sort(List,List(Compate))
第二种方法更灵活,且在运行的时候不用编译。

注意:要想实现comparTo()就必须在主方法中写上implement comparable.


集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误。
解决的方法是添加类型的判断。

而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。

LinkedList经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。
队列:先进先出的数据结构。
堆栈:后进先出的数据结构。
注意:使用堆栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。
LinkedList提供以下方法:(ArrayList无此类方法)
addFirst();
removeFirst();
addLast();
removeLast();


Push用addFirst();pop用removeFirst(),实现后进先出。
用isEmpty()--其父类的方法,来判断栈是否为空。

在队列中,put为入队列操作,get为出队列操作。
Put用addFirst(),get用removeLast()实现队列。

List接口的实现类(Vector)(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)
结论:在考虑并发的情况下用Vector(保证线程的安全)。
在不考虑并发的情况下用ArrayList(不能保证线程的安全)。

面试经验(知识点):
java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
对于堆栈和队列只能用push类和get类。
Stack类以后不要轻易使用。
!!!实现堆栈一定要用LinkedList。


(在JAVA1.5中,collection有queue来实现队列。)








posted @ 2007-03-19 22:04 J2S 阅读(556) | 评论 (1)编辑 收藏

关于集合框架类的学习笔记

集合类

集合类的对象是用来管理其他若干对象的,它类似于C++标准模板库中的容器,不过在JAVA的集合类的对象中可以用来存放多种类型的对象。

接口和类共同构成了一个集合框架,集合的概念,一个对象可以装载多个对象,这个对象就是集合对象。

集合框架

1,接口

Collection 用来管理多个对象,集合中的每个元素都是对象。

Map,Map中没有对象,而是键值对,由Key,value组成的键值对,Key是不可重复的。value是可以相同的,一个Key和一个value一一对应。

集合中用到的类,接口在java.util包中,在使用时注意将其引入import。

Collection 接口(以下介绍其子接口)

1)List 一个List的实现类的对象在管理多个对象时会按顺序组织对象(即按照将对象放入的顺序存储),List实现类的对象是由顺序的。(注意,顺序和排序的区别)

2)Set 一个Set的实现类表示一个数学概念上的集合,Set的实现类的对象中的元素是无顺序的,也就是不会按照输入顺序来存放,Set的实现类对象中的元素是不重复的。

3)SortedSet,他是Set的子接口,他的实现类会对集合中的元素进行排序。但是要指定排序规则,他会按排序规则进行排序。

Map 接口(以下介绍其子接口)

SortedMap,这个接口的实现类同样可以实现,不过是对键值对中的Key进行排序,这个接口的实现类也是要指定排序规
则的。

JDK1.4中的集合是不安全的对象,JDK5.0中解决了这个问题

List接口的实现类

1> ArrayList是接近于功能的集合类,ArryList的实质就是一个会自动增长的数组,ArrayList是用封装的数组来实现的List接口的。

Collection的实现类对象的遍历方式是用迭代来实现的。
在使用迭代器时先要活得一个迭代器的对象,Iterator(迭代器接口)这是一个接口,迭代器是在集合类中实现的,也
就是说,他是一个内部类(匿名内部类)实现的。
Iterator接口中定义的常用方法方法hasNext(),next()。
hasNext(),这个方法会使用一个游标,并通过判断游标指向的位置是否存放有对象。
next()方法也是Iterator接口中定义好的方法,这个方法会使游标指向下一个元素的位置,游标会跳过第一个元素,并
返回其中的内容。

Collections 这是一个工具类,也是java.util包中的,这个类中的sort(list接口的实现类的对象)方法,其参数是一个集合类的对象,这个方法使用来对集合类的对象进行排序的。以后,我将以集合这个名字来称呼集合类的对象。,对于
字符串对象内容的集合来说会按字典顺序排序(升序),对于数字内容的集合排序也会按照升序排序

排序可一份为两部分内容,一个是排序的规则,也就是按照什么来进行排序,并且排成什么样的顺序。
第二个就是排序的算法,他决定了排序的效率。

在对自定义的集合内容类型排序时,需要先定义那个类型的排序规则。

Comparable接口,这个接口中只定义了一个compareTo(Object o),方法的返回至类型是整型,如果当前对象大于参数对象就返回正数,当前对象等于参数对象是就返回0,当前对象小于参数对象时就返回负值,这样写就是升序排列,反之则是进行降序排列,在实现这个接口中的方法时,返回值定义方式,只有这两种。

根据指定类型的排序规则实现了Comparable接口,那么就可以对存有这个类型的集合进行整体排序。Comparable接口,
也叫做可比较接口。这个接口在java.lang包下。只要实现了这个接口,就是可排序的

接下来介绍另外一种对自定义类型对象的集合整体排序的方法,也就是实现比较器接口(Comparator),这个接口中定义了一个compare(Object o1,Object o2)方法来比较两个对象,这个方法的返回值定义和上面介绍的那个方法是一样。

注意:在API,帮助文档中以上两个方法的参数类型是T,这代表的模板类型,也就是集合中存放的内容的类型,在JDK1.4中其参数就是Object类型,模板类型的详细内容会在最后的JDK5.0新特性中讲到。

Comparator接口可以在匿名内部类中实现,Collections 中的sort(集合了的对象,比较器)方法,可以对自定义类型内容的集合进行整体排序。

2>LinkedList,它是List接口的实现类,其底层是用双向循环链表来实现的

注意:ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。
     LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

ArrayList,LinkedList都是线程不安全的
实现堆栈 1,数组(ArrayList,增删效率比较低,不适合)
        2,LinkedList实现堆栈的好方法
        3,java.util.Stack类,Stack是Vector的子类,Vector类是一个线程安全的(是一个重量级的类),并继承
了Vector的方法,Verctor类和ArrayList的功能近乎相同。(不推荐使用Stack类来实现堆栈)。

Set接口的实现类

HashSet

Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的,HashSet的底层实现还是数组

Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

Hash算法是一种散列算法。

注意:所以要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素容不重复。在覆盖和hashCode()方法时,要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时,也要尽量使不同对象尽量返回不同的Hash码值。

如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象),才会用equals()方法来判断两个对象的内容是否相同。

SortedSet接口是Set的子接口。
TreeSet是SortedSet接口的实现类,他可以对集合中的元素进行排序。
要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入世就进行了排序。(在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)

要排序时才使用TreeSet类(存储效率比较低),HashSet的存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。

posted @ 2007-03-19 21:55 J2S 阅读(1181) | 评论 (0)编辑 收藏

如何最快成为有钱人

通向财富的道路有千万条,但条条道路都惊人地相似。而且令人诧异的是,拼命积累财富的男人也惊人地相似,他们在心理特征上就像是同一个模子压出来的一样。

    百万富翁有诸多特征,绝大多数白手起家的百万富翁都是出身贫穷的人,积累金钱对于那些一贫如洗的人有着不可抗拒的力量。

    这些男人是很有冒险精神的,他们敢于冒那些脚踏实地、像苦工似地挣钱的男人所不敢涉足的风险。他们是精明强干的,他们很有远见卓识;他们的天才在于能知道如何利用别人的主意来赚钱。这是赚钱的真正秘诀——利用别人创造性的思想,并且把它们运用到实际中去。

    这样的男人很容易和别人打成一片。他们很有洞察力,他们会观察别人,知道如何通过与别人打交道来获得他们所需要的东西,也知道别人对他们的反应如何。追求财富的人内心深处有着强烈的孤独感,但他们并不因此而去追求政治上的名望和成就。赚钱是他们绝对全神贯注的追求。这给他们胜于一切的最大满足和快乐。

    1、让金钱成为你的情人。

    别在性爱上浪费时间和精力,你会发现,从长远来看,赚钱比性爱更让人兴奋,这可不是空头支票。寻求需求,满足需求。追求财富者的最大天分是瞄准时机,预测所需。大众牌小汽车,美国快餐食品都是满足人们需要的例子。

    2、谨防从众心理。

    群众心理弊病多,即使它是正确的,追随它一般也没有什么利润。在一般情况下,摘取经济精华的都是带头人而不是追随者。

    3、当雇主而不是雇员。

    那些满足于雇主付给他们高薪的男人并不是真正追求财富的人,他们的目标仅仅是成就感或权力欲。你最好去当老板,即使雇员只有你一个,赚的钱也会比任何一个公司付给你的多。

    4、发展你的支配技巧。

    大多数人认为,支配别人,让他们去做你想让他们干的事情非常恶劣。然而,实际情况是,我们时时都在自己没有意识到的情况下支配着别人。

    5、追求财富的人常常是直觉地支配着别人,而且是个行家里手。
 

posted @ 2007-02-21 15:40 J2S 阅读(232) | 评论 (0)编辑 收藏

终于解脱了...

        下午答辩,还算顺利,虽然花了半天时间,没任何技术含量,但是终于解脱了...

         五天来平均每天也就睡了不到两小时,现在真有点顶不住了(意识都模糊了),但是为了把生物钟调整过来,还是撑一会吧。突然闲下来却不知道做点什么,20号有个面试,等会没事把Struts那本书再看看。

         接下来都不知道写些什么东西,就把实践中的一个弄明白的一个小知识记一下:
在JDBC中,对于游标对象ResultSet的getString()方法也是用游标的模式来读取数据的(不知道这样描叙对不对),即,你要取字段1,字段2,就必须先调用rs.getString(1),再调用rs.getString(2),不能反过来,否则不能正确读取。原因还不知道,有空了研究一下。

posted @ 2007-01-18 19:56 J2S 阅读(361) | 评论 (3)编辑 收藏

期末实践中......

今天成绩都出来了,结果还是比较理想的,以后会相对轻松些。

更新日志都是半个月前的事了,当时还说以后每天都更新,真是惭愧

这几天都是忙考试,弄得心力憔悴,今天晚上终于闲下来,继续写实践的程序。

刚刚解决了前几个小时的困惑,现在对JAVA的内部类机制又有了更新的认识(兴奋中......),废话少说,来看代码:

package tanzhang;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import com.swtdesigner.SWTResourceManager;
import org.eclipse.swt.widgets.TabItem;
public class tanzhang {

 /**
  * Launch the application
  * @param args
  */
 private static Table table;
 private static TableItem newItemTableItem;

 
 public static void main(String[] args) {
  final Display display = Display.getDefault();
  final Shell shell = new Shell();
  shell.setImage(SWTResourceManager.getImage(tanzhang.class, "/org/eclipse/ui/internal/forms/widgets/progress.gif"));
  shell.setSize(774, 514);
  shell.setText("宣城供电局消弧线圈台帐");
............
............
............
  final Combo combo_1 = new Combo(composite, SWT.READ_ONLY);
  combo_1.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent arg0) {
    String str=combo_1.getText();
    try{ 
     String dbUrl = "jdbc:odbc:test";
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     Connection conn = DriverManager.getConnection(dbUrl, "", "");
     Statement stmt=conn.createStatement();
     String sql="SELECT * from test where 单元名称="+str;
     ResultSet rs=stmt.executeQuery(sql);
     
     if(rs.next()){
     for(int i=0;i<=4;i++){         
       newItemTableItem.setText(i,rs.getString(i+1));  
       }
     
     rs.close();
     stmt.close();
     conn.close();
     }
    }catch(Exception e){}
    
   }
  });
............
............
............

  table = new Table(composite_1, SWT.VIRTUAL | SWT.FULL_SELECTION | SWT.BORDER | SWT.HIDE_SELECTION);

  table.setLinesVisible(true);
  table.setHeaderVisible(true);
  table.setBounds(0, 0, 678, 80);
............
............
............

   刚开始是用final修饰table和newItemTableItem,但是“newItemTableItem.setText(i,rs.getString(i+1));”这行(代码中兰色那句)会报错,编译器提示“无法解析newItemTableItem”。我的第一反应是监听器的位置放得不对。翻了一下书,说SWT/JFace事件代码中要访问类中变量有三种方法:(1)加final;(2)将变量变为类的实例变量;(3)将事件代码写成命名内部类,然后通过构造函数的参数来传入。
   想了想好象只有第三种方法值得试试,但是后来想起来newItemTableItem是个对象,传入以后却不知道怎么转换类型,呆了...
   最后做了个新的程序试了试,在新程序里是成功的,就是要把newItemTableItem在main函数外申明其为private static,但是在旧的程序中,编译器是通过了,但是进行连接数据库查询的时候,出现“Fatal Exception...”的错误,当时一下就蒙掉了!!完全一样的,怎么会不成功。
   百般无奈以后,----当然之前肯定是深思熟虑----终于脑海中闪出了传说中的“灵感”!于是马上把table也定义为private static......OK!   胜利总是来得那么突然,那瞬间的感觉就象90分钟打进的金球...

   当然到现在,我还没找到确切的原因。只能用自己的话总结一下:(1)匿名内部类中的方法是不能访问其他方法中定义的变量的(包括实例对象),要访问必须在类中将其定义为static类型。(2)TableItem是Table的子控件,要定义TableItem为static也要同时把Table定义为static类型。

   给自己一个任务:研究JAVA的内部类机制;研究SWT中父子控件关系的机制!

   看看《Thinking in JAVA》或许会是个不错的选择,当然还有《The Definitive Guide to SWT and JFace》。

 

posted @ 2007-01-15 02:41 J2S 阅读(302) | 评论 (0)编辑 收藏

考完试了!

昨天终于考完了!
都大四了,还用最变态的老师(三大魔头)来折磨我们,对于这学校真无语了......

现在终于可以继续我的自由学习之旅,以后一定每天上来更新blog。
时间不多了,既然已经饱受过往昏昏惑惑之疾、因循苟且之痛,那么现在就要珍惜分分秒秒,弥补差距。

今天下午花了两个小时把XML SPY教程学了一遍(没想到这么快能搞定),我用的是2007,学的是2005,但基本上没区别,进度还是蛮快的。最后估计那个xml schema文件没写好,最后用xslt转换没成功。不过晚上准备再试一次,权当做复习。
以前都用记事本写xml,现在用了xml spy感觉真是太好用了,尤其是xml数据与数据库的互相转换。而且还可以用工程来管理(还没试呢),对于开发大一点的程序无疑方便了许多。

晚上再准备把struts那本书看看。

对了,今天元旦,祝大家新年快乐,祈祷家人在新的一年里平平安安!

posted @ 2007-01-01 16:42 J2S 阅读(213) | 评论 (0)编辑 收藏

<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(2)

随笔档案

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜