posts - 39,  comments - 263,  trackbacks - 0
  2006年3月11日
    这几天用TimerTask作了个框架,担心超过十万条数据的时候速度变慢,其实每秒十万次的运行速度等到以后放在服务器上运行应该游刃有余吧,还不清楚,不过现在在我笔记本上运行得还可以,内存吃的很大,java就这毛病,程序员不能自由释放内存。1G内存不够用,我笔记本2G有分配不了,似乎虚拟内存java用不了,没仔细做过实验。
    这几天看新闻知道番茄花园作者被警方逮捕,树大招风,枪打出头鸟,很正常,从程序员的身份来讲,盗版是要打击的,不过我本身电脑里要付费的软件都是盗版的,很矛盾,呵呵。
posted @ 2008-08-21 23:54 nake 阅读(2137) | 评论 (3)编辑 收藏
实在太久没写servlet了,应该至少1年了,那时候做了点皮毛,现在项目要求用到servlet的相关知识,同时我在blogjava的bolg又开张了。学习的过程将记录在我的blog中。对比了一下netbean和eclipse感觉用netbean编写servlet程序方便些,eclipse用了几年,但是还是感觉每次要找好相关的jar需要花费太多时间,于是决定用netbean编写了。
posted @ 2008-07-12 15:15 nake 阅读(1937) | 评论 (2)编辑 收藏
看看以下代码:
将26个英文字母重复加了5000次,

String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1=System.currentTimeMillis();
  String str ="";
  for(int i=0;i<times;i++)
  {
   str+=tempstr;
  }
  
  long lend1=System.currentTimeMillis();
  long time = (lend1-lstart1);
  System.out.println(time);

可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 154735 左右。
也就是154秒。
我们再看看以下代码

String tempstr = "abcdefghijklmnopqrstuvwxyz";
 
  int times = 5000;
long lstart2=System.currentTimeMillis();
  StringBuffer sb =new  StringBuffer();
  for(int i=0;i<times;i++)
  {
   sb.append(tempstr);
   
  }
  long lend2=System.currentTimeMillis();
  long time2 = (lend2-lstart2);
  System.out.println(time2);
 得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。
下一次我将解释为什么StringBuffer 的效率比String 高这么多。
posted @ 2007-01-14 12:24 nake 阅读(4203) | 评论 (4)编辑 收藏

swt 简单的托盘程序
java写和操作系统相关的程序难度非常大。在java 6出现之前,如果你想实现一个托盘程序,最简单的就是用swt了。
通过google我找到了一段代码。
其实很简单。主要的代码如下:
             final Tray tray = display.getSystemTray();
            final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
            Image image = new Image (display, 16, 16);
            trayItem.setImage(image);
知道了重点,事情变的很简单了。看看所有程序
//-----------------
public class SystemTray extends Shell {
    public static void main(String args[]) {
        try {
            Display display = Display.getDefault();
            SystemTray shell = new SystemTray(display, SWT.SHELL_TRIM);
           // shell.createSystemTray(shell);
            final Tray tray = display.getSystemTray();
            final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
            Image image = new Image (display, 16, 16);
            trayItem.setImage(image);
            shell.open();
            shell.layout();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public SystemTray(Display display, int style) {
        super(display, style);
        createContents();
    }

    /**
     * Create contents of the window
     */
    protected void createContents() {
        setText("SWT Application");
        setSize(500, 375);

    }
    //swt 默认情况下不允许shell被继承
    //所以我重载了父类的方法
    protected void checkSubclass() {
         }
}
//--------------------
如果你想成功运行以上代码,你最好在eclipse下新建一个swt的类。具体操作你搜索一下吧。
但是上面的代码只是加入了托盘,这可能是最简单的实现托盘的程序了。我们加入事件处理,让程序能够最大和最小化。然后把托盘用图片来表示。
详细的代码不参考
下载 到eclipse里运行

posted @ 2007-01-03 22:58 nake 阅读(3404) | 评论 (4)编辑 收藏
从8.1号开始,连续加班,再过1小时结束。
posted @ 2006-09-21 02:39 nake 阅读(973) | 评论 (4)编辑 收藏

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。

再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。

如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
 int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。

于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。


public class Person {
  String firstname,lastname;
  Boolean sex;
  Integer age;
  public Person(String firstname,String lastname,Boolean sex,Integer age) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.sex = sex;
    this.age = age;
  }
  public String getFirstName() {
     return firstname;
   }

   public String getLastName() {
     return lastname;
   }
   public Boolean getSex() {
      return sex;
    }

    public Integer getAge() {
      return age;
    }

//为了输入方便,重写了toString()

public String toString()
    {
      return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
    }
}
//end person

下面是要实现比较器


public class Comparators {
  public static java.util.Comparator getComparator() {
    return new java.util.Comparator() {

      public int compare(Object o1, Object o2) {
        if (o1 instanceof String) {
          return compare( (String) o1, (String) o2);
        }
       else if (o1 instanceof Integer) {
          return compare( (Integer) o1, (Integer) o2);
        }

       else if (o1 instanceof Person) {
      return compare( (Person) o1, (Person) o2);
    }

        else {
          System.err.println("未找到合适的比较器");
          return 1;

        }
      }

      public int compare(String o1, String o2) {
        String s1 = (String) o1;
        String s2 = (String) o2;
        int len1 = s1.length();
        int len2 = s2.length();
        int n = Math.min(len1, len2);
        char v1[] = s1.toCharArray();
        char v2[] = s2.toCharArray();
        int pos = 0;

        while (n-- != 0) {
          char c1 = v1[pos];
          char c2 = v2[pos];
          if (c1 != c2) {
            return c1 - c2;
          }
          pos++;
        }
        return len1 - len2;
      }

      public int compare(Integer o1, Integer o2) {
        int val1 = o1.intValue();
        int val2 = o2.intValue();
        return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));

      }
      public int compare(Boolean o1, Boolean o2) {

         return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));

       }

      public int compare(Person o1, Person o2) {
        String firstname1 = o1.getFirstName();
        String firstname2 = o2.getFirstName();
        String lastname1 = o1.getLastName();
        String lastname2 = o2.getLastName();
        Boolean sex1 = o1.getSex();
        Boolean sex2 = o2.getSex();
        Integer age1 = o1.getAge();
        Integer age2 = o2.getAge();
        return (compare(firstname1, firstname2) == 0 ?
                (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
                 compare(age1, age2)) :
                 compare(sex1, sex2)) :
                 compare(lastname1, lastname2)) :
                compare(firstname1, firstname2));

      }

    };
  }

}
以上代码有可能因为浏览器的布局自动换行。
compare(Person o1, Person o2)的返回值看起来比较别扭。最简单的是

    public int compare(Boolean o1, Boolean o2) {

         return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));

       }

o1和o2相等返回0,否则o1如果是true 就表示o1大于o2。

再尝试输出结果看看


public class Main {
  public Main() {
  }
  public static void main(String[] args) {
    Person[] person = new Person[] {
         new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
         new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
         new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
         new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),


     };
     for (int i = 0; i < person.length; i++) {
       System.out.println("before sort=" + person[i]);
     }
     java.util.Arrays.sort(person, Comparators.getComparator());
  for (int i = 0; i < person.length; i++) {
    System.out.println("after sort=" + person[i]);
  }


  }

}

输出结果:

before sort=ouyang feng 男 27

before sort=zhuang gw 男 27

before sort=zhuang gw 女 27

before sort=zhuang gw 女 2

after sort=ouyang feng 男 27

after sort=zhuang gw 女 2

after sort=zhuang gw 女 27

after sort=zhuang gw 男 27


仔细理解java的Comparator会给你写排序带来很大帮助


 

posted @ 2006-05-27 17:20 nake 阅读(2277) | 评论 (5)编辑 收藏
 

软件项目,特别是给企业用户的项目,实施过程大多辛苦,而且一部分问题不在于软件本身。

总结一下项目最后验收阶段案例之一。

案例:项目已经按照客户确认的调研文档完成实施工作。客户的一把手提出新需求。

此一把手HH精通业务,对电脑一窍不通。H对手下电脑部负责人Z提出“要对业务进行风险管理,把风险大的业务提出来。”,一句话令Z头大。Z苦恼H没有定义什么是风险大,即使H说明风险大的条件,现有的软件架构,数据模型能否实现还是未知数。实现此功能成为不可完成的任务。持续下去Z和项目经理W(软件公司负责人)都面临困境。

Z会被认为没有完成领导安排的工作(实际上他忙的焦头烂额)。

W进入两难,一方面客户要求的完成不了,另一方面面临公司的的项目要拖延。

解决办法:1.按章办事,调研文档已经写清楚无此需求。直接拒绝。此为下策,没办法才用,但是关键时刻很有用。

2.引导+忽悠。对付H这种老总要从其公司内部出发。分析满足他需求所需要的条件。一般要牺牲部分工作人员的工作时间。然后把影响放大,吓唬他。如果可以的话可以找他们的相关人员帮忙,让他听到不同的声音,让他放弃此念头。因为软件他是外行,谈论软件时心里没底气,有自己人反对,心虚。

比如从财务着手比较有效。要满足H的需求改变了财务的核算体系,原有的数据都要加上某写核算项,不能保证数据准确性,而且大大增加了财务工作量,而且不符合会计制度(忽悠)。上策!

posted @ 2006-05-16 17:46 nake 阅读(3240) | 评论 (2)编辑 收藏

转载请注明出处:http://www.blogjava.net/nake/
   自从
java 发布的第一个版本开始就已经包含 JDBC 了。目前已经有 10 个年头了。 JDBC4.0 将要被打包到 java6.0 里( java SE J2SE 新的名字)。它展现设计的重大提升和提供更加丰富的 API ,更加重视简易开发和提高生产力

       本文将讨论一些 JDBC 在改善设计和提高性能上的重要的变化。但是不能列举每一个变化。

注解和泛型

我想你已经了解了包含在 JAVA 5.0 的注解( annotations 和泛型( generic 也有翻译范型)。 JDBC4.0 也引进了注解和泛型 DataSet ,这使得执行 sql 语句和 SQL  DML data manipulation  language 定义变的简单。

       在新的 API 里定义了一套 Query DataSet 接口。 Query 接口定义了一套方法,这些方法描述了 SQL select update 语句。而且详细介绍了结果集如何绑定为一个 DataSet 的。因为泛型所以 DataSet 是可以带参数的。因此可以说 DataSet 接口是类型安全的( type-saft .

所有 Query 接口都要从 BaseQuery 接口继承。可以通过 Connection.createQueryObject() 或者 DataSource.createQueryObject() 得到Query对象。

一个DataSet接口都继承java.util.List   DataSet 是有列概念的数据集,能从 Query 接口得到,并且可以带有参数。 DataSet 可以在连接和断开连接的情况下使用。从而 DataSet 实现了 ResultSet (连接) 或者   CachedRowSet (可以断开连接)。因为DataSetjava.util.List的子接口,所以可以通过java.util.Iterator来访问每一行。

DataSet 接口可以带系统或者用户自己定义的类作为参数。通过两种方法你可以实现:构造函数或者 JavaBeans 对象,任何一个办法都能达到将用户自定义的类绑定到结果集的列里。但是在其它支持 JavaBeans 的框架里,用 JavaBeans 对象的实现就显更加容易使用。

下面简单举例说明如何通过新的 API 创建和运行 SQL 查询。用用户自定义的类来定义结果集。(拷贝时候小心有制表符)

pubic class Employee {
   private int employeeId;
   private String firstName;
   private String lastName;

   public int getEmployeeId() {
      return employeeId;
   }
  
   public setEmployeeId(int employeeId) {
      this.employeeId = employeeId;
   }

   public String getFirstName() {
      return firstName;
   }

   public setFirstName(String firstName) {
      this.firstName = firstName;
   }

   pubic String lastName() {
      return lastName;
   }

   public setLastName(String lastName) {
      this.lastName = lastName;
   }
}

interface EmployeeQueries extends BaseQuery {
   @Select (sql="SELECT employeeId, firstName, lastName FROM employee")
   DataSet<Employee> getAllEmployees ();

   @Update (sql="delete from employee")
   int deleteAllEmployees ();
}


Connection con = ...

EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);

DataSet<Employee> empData = empQueries.getAllEmployees ();

 

异常处理的增强:

1.       SQLException 分为两类 transient non-transient

2.       支持连锁的异常。

3.       继承了 Iterable 接口。

因为继承了Iterable 所以你可以这样写:

catch(SQLException ex) {
   for(Throwable t : ex) {
      System.out.println("exception:" + t);
   }
}

SQLExceptions.JPG
参考

  • http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html
  • JSR 221: JDBC 4.0 Specification:
  • http://www.jcp.org/en/jsr/detail?id=221
    未完

    posted @ 2006-05-11 22:26 nake 阅读(6756) | 评论 (4)编辑 收藏
             陈水扁一边呛美,另一边却热情对待布什夫人;他前天(2006-5-9)在哥斯达黎加总统就职大典上两度“突袭”美国总统夫人劳拉的画面,昨天一整天在台湾岛内电视热播。

      当时正举行哥国总统就职大典,陈水扁坐在第一排,劳拉则坐在第二排。阿扁不时转头瞄向左后方的劳拉,等到表演节目开始时,扁跨步越过身边所有人走到劳拉身旁寒暄。据说,扁邀请劳拉到台湾访问,劳拉则礼貌性回答“谢谢”。


             至典礼结束时,全场嘉宾起身鼓掌,扁忽然再一个箭步冲向劳拉。劳拉表情有些错愕,但双手继续鼓掌。扁此时伸出右手,悬空一阵后主动去轻抓劳拉正在鼓掌的手,迫使劳拉不得不与他相握。手一握到,扁立刻双手紧抓不放,左手还不断拍打,劳拉的另一只手此时却不期然地移到自己胸前捂住,还下意识地抓紧了衣领。同时,扁的传译员却已摆好了相机,扁示意劳拉对着镜头微笑,终于完成了这张与总统夫人微笑握手的历史合照。
    原文出自http://www.zaobao.com/gj/zg060511_501.html
    posted @ 2006-05-11 19:23 nake 阅读(493) | 评论 (1)编辑 收藏
      整整一天的时间都在查bug,对数,然后找到错误的原因。需要我认真,仔细,不要放弃,不要绕过困难。找bug需要方法和耐心,要记录下多种数据和过程,不要做无头苍蝇,如果数据像今天一样多要先给数据分类分段排除。
    posted @ 2006-05-09 23:50 nake 阅读(367) | 评论 (0)编辑 收藏
       最近看2本书,一本关于ajax的,一本是《Agile Software Develpment》。先看ajax,我实在不想公布它的书名,感觉被骗了,广告做得好,翻译和内容都很差。《Agile Software Develpment》还行,同时也学习了英文,是本值得细读得书。
    posted @ 2006-04-24 22:39 nake 阅读(394) | 评论 (0)编辑 收藏
       周六周日抽空完成了Table类的排序和搜索功能。搜索速度还能接受,搜索2万条记录没感觉到停顿,更多的记录我还没测试,排序就够呛,起初花了30分钟还没完成,郁闷!comparator要进行优化。

      public int compare(Number o1, Number o2) {
        double n1 = o1.doubleValue();
        double n2 = o2.doubleValue();
        if (n1 < n2) {
          return -1;
        } else if (n1 > n2) {
          return 1;
        } else {
          return 0;
        }
      }

    感觉应该还好,应该是其它地方没处理好。
    接下来我要处理
    1.改变JTable原来的UI 在table底下加入可以汇总的表格
    2.JTable类在浏览器上的表现
    3.dataset直接的关联在table中实现
    posted @ 2006-04-18 20:43 nake 阅读(444) | 评论 (0)编辑 收藏

        好像是两年前第一次接触eclipse,不记得版本号了。那时候eclipse小有名气,可能是本身喊的出名字的工具就只有jb。公司买的是jb6,但是我们都贪新,用刚出的jb9。结果因为用盗版被borland协同工商罚了好多钱(你不信就开防火墙,用jb调试程序,看看防火墙情况)。从此公司开始使用eclipse。
        正是eclipse由IBM等出资和开源的缘故有人说eclipse是六大门派里的少林,听起来有点道理。武当派(jboss)已经归于redhat名下(我不喜欢jboss因为他的名字里有个Boss)。可能我很喜欢eclipse了,生怕有一天开始收费,或者被收购,毕竟不是原滋原味。
        eclipse发展太快,几乎一个月一个Milestone,现在是3.2M6了,最后一个M。如果按照此速度4月要出3.2的stable build版本的RC1了。其中一项新特性是速度有所提升。看看我为了玩java我机器的配置吧。

    posted @ 2006-04-13 23:27 nake 阅读(233) | 评论 (0)编辑 收藏

    今晚无聊 用google google 了google 有2,580,000,000项符合查询结果。无意中有看到新成员froogle 。google家族成员越来越多,可是中文版出得就相对慢,而且不一定能顺利在中国推广,或者以后google没个家族成员都有类似提示据当地法律法规和政策,部分搜索结果未予显示。
    喜欢google,喜欢他简洁、快速。

    posted @ 2006-04-05 00:32 nake 阅读(235) | 评论 (0)编辑 收藏

    Table类的mind图.
    Table类的设计.jpeg

    当然还有TableModel 没有画进来,因为它将会是变化多端的.code_name_map也没有画.还有辅助录入以前写过就不说了.
    事件的处理以后再花时间写清楚了.

    posted @ 2006-03-29 23:29 nake 阅读(939) | 评论 (3)编辑 收藏

    今晚一边考虑了DataRow,Cell,DataSet,DataTable,Connect,DataProvider的构架一边看 《一球成名》,觉得很惬意.

    posted @ 2006-03-28 23:07 nake 阅读(425) | 评论 (0)编辑 收藏
    我的工作就是和数据库打交道,数据库当然离不开dataset,用了几年borland的dx.jar. borland这次看来真的玩完了.回想borland的历史,每次危机时刻都有英雄出现,扭转局面.但愿这次也如此.
    我近段时间要完成的工作:
    1.完善我的dataset.
    2.实现table里的过虑,快速查找等功能

    接下来我才考虑用以上模块实现项目管理软件.
    posted @ 2006-03-27 23:57 nake 阅读(261) | 评论 (0)编辑 收藏
    Subversion 已经代替了CVS,至少在SourceForge上是如此.我花了一个晚上时间玩玩.原来在公司用vss,感觉能用就将就了.毕竟用哪个版本控制器不重要.
    posted @ 2006-03-27 23:43 nake 阅读(229) | 评论 (0)编辑 收藏

    java 的Table类采用了MVC模式,所以设计出多种视图相对容易.
    但是在工作中为了如果Table里的数据能用Tree的方式组织起来,数据会更加紧凑,结构清晰.
    效果如图:但是往往工作中数据没那么少,那么简单
    效果图.JPG

    下图是树型图的思维图

    树型Table.jpeg

    基本上程序上要写的地方有:
    1.实现TreeModel接口,
       同时实现TableModel中几个必要函数
        public Class getColumnClass(int column);
        public int getColumnCount();
        public String getColumnName(int column);
        public Object getValueAt(Object node, int column);
        public boolean isCellEditable(Object node, int column);
        public void setValueAt(Object value, Object node, int column);
       使tree和table能相互结合使用
    2.继承AbstractTableModel
       将1中继承TreeModel和此结合
    3.继承TableCellRenderer
       要覆盖paint,updateUI 要实现getTableCellRendererComponent

    4.TreeModelListener的实现了

    整体的代码不长 但花了我不少时间.需要的话留下mail吧.
    此代码还有不完善的地方.如和sql结合.

    posted @ 2006-03-11 13:15 nake 阅读(2901) | 评论 (45)编辑 收藏
    <2006年3月>
    2627281234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用链接

    留言簿(18)

    我参与的团队

    随笔档案(39)

    收藏夹(1)

    搜索

    •  

    积分与排名

    • 积分 - 450892
    • 排名 - 118

    最新评论

    阅读排行榜

    评论排行榜