2006年5月9日
这几天用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) |
编辑 收藏
软件项目,特别是给企业用户的项目,实施过程大多辛苦,而且一部分问题不在于软件本身。
总结一下项目最后验收阶段案例之一。
案例:项目已经按照客户确认的调研文档完成实施工作。客户的一把手提出新需求。
此一把手H,H精通业务,对电脑一窍不通。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
(可以断开连接)。因为DataSet是java.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);
}
}
参考
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 阅读(6757) |
评论 (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) |
编辑 收藏