我家在海南,那生产咖啡、椰子,我在想把java和椰子结合应该是不错的味道...
Apache+ActiveMQ教程
[
2010/02/15 22:14 | by fubin ]
2010/02/15 22:14 | by fubin ]
Vector 还是ArrayList――哪一个更好,为什么?(转载于JavaWord)
[
2008/08/27 09:11 | by fubin ]
2008/08/27 09:11 | by fubin ]
要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:
l API
l 同步处理
l 数据增长性
l 使用模式
下面针对这4个方面进行一一探讨
API
在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。
[b]同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
propedit4.8.2
[
2008/07/03 11:47 | by fubin ]
2008/07/03 11:47 | by fubin ]
Eclipse属性文件编辑插件。
修改:D:\Program Files\MyEclipse 5.5 GA\eclipse\links\com.genuitec.eclipse.MyEclipse.link文件
假如配置路径(注意windows目录是双\\):path=d:\\Program Files\\MyEclipse 5.5 GA\\propedit4.8.2
开源的异步处理模块(Beans Binding)
[
2008/03/26 23:54 | by fubin ]
2008/03/26 23:54 | by fubin ]
Beans Binding,这是一个异步处理模块的处理模块,效率很高,也很安全。
开源工程地址:https://beansbinding.dev.java.net/
我把用源代码做了一个测试工程,相关的文档请阅读
http://today.java.net/pub/a/2008/03/20/synchronizing-properties-with-beans-binding.html
开源工程地址:https://beansbinding.dev.java.net/
我把用源代码做了一个测试工程,相关的文档请阅读
http://today.java.net/pub/a/2008/03/20/synchronizing-properties-with-beans-binding.html
ThreadLocal实现session唯一(转载)
[
2008/01/15 14:01 | by fubin ]
2008/01/15 14:01 | by fubin ]
在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的,以往是通过eclipse的插件来自动完成这些代码的,当然效果是不错的,但是总是觉得不爽(没有读懂那些冗长的代码),所以现在打算自己实现Session管理的代码。我们知道Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。Session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱,你能够想像那些你根本不能预测执行顺序的线程对你的一条记录进行操作的情形吗?
在Session的众多管理方案中,我们今天来认识一种名为ThreadLocal模式的解决方案。
早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
public class ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object get() {
Thread currentThread = Thread.currentThread();
Object result = values.get(currentThread);
if(result == null&&!values.containsKey(currentThread)) {
result = initialValue();
values.put(currentThread, result);
}
return result;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
public Object initialValue() {
return null;
}
}
那麽具体如何利用ThreadLocal来管理Session呢?Hibernate官方文档手册的示例之中,提供了一个通过ThreadLocal维护Session的好榜样:
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session =
new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}
只要借助上面的工具类获取Session实例,我们就可以实现线程范围内的Session共享,从而避免了线程中频繁的创建和销毁Session实例。当然,不要忘记在用完后关闭Session。
写到这里,想再多说一些,也许大多数时候我们的DAO并不会涉及到多线程的情形,比如我们不会将DAO的代码写在Servlet之中,那样不是良好的设计,我自己通常会在service层的代码里访问DAO的方法。但是我还是建议采用以上的工具类来管理Session,毕竟我们不能仅仅考虑今天为自己做什么,还应该考虑明天为自己做什么!
在Session的众多管理方案中,我们今天来认识一种名为ThreadLocal模式的解决方案。
早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
public class ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object get() {
Thread currentThread = Thread.currentThread();
Object result = values.get(currentThread);
if(result == null&&!values.containsKey(currentThread)) {
result = initialValue();
values.put(currentThread, result);
}
return result;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
public Object initialValue() {
return null;
}
}
那麽具体如何利用ThreadLocal来管理Session呢?Hibernate官方文档手册的示例之中,提供了一个通过ThreadLocal维护Session的好榜样:
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session =
new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}
只要借助上面的工具类获取Session实例,我们就可以实现线程范围内的Session共享,从而避免了线程中频繁的创建和销毁Session实例。当然,不要忘记在用完后关闭Session。
写到这里,想再多说一些,也许大多数时候我们的DAO并不会涉及到多线程的情形,比如我们不会将DAO的代码写在Servlet之中,那样不是良好的设计,我自己通常会在service层的代码里访问DAO的方法。但是我还是建议采用以上的工具类来管理Session,毕竟我们不能仅仅考虑今天为自己做什么,还应该考虑明天为自己做什么!
取得标准的JavaBean所有的方法属性
[
2008/01/11 23:58 | by fubin ]
2008/01/11 23:58 | by fubin ]
public static PropertyDescriptor[] getPropertyDescriptors(Class clazz) throws AppException {
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(clazz);
} catch (IntrospectionException e) {
throw new AppException("Can not get bean info!");
}
return beanInfo.getPropertyDescriptors();
}
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(clazz);
} catch (IntrospectionException e) {
throw new AppException("Can not get bean info!");
}
return beanInfo.getPropertyDescriptors();
}
强烈建议使用的通用第三方库Apache Commons
[
2007/12/23 23:01 | by fubin ]
2007/12/23 23:01 | by fubin ]
这个库给我们提供了非常多的基础功能。
例如随机产生指定位数的方法:
import org.apache.commons.lang.RandomStringUtils;
/**
*
* @author www.cujava.com
* 产生随机数的方法。
*
*/
public class Test {
public static void main(String[] args) {
System.out.print("动态的四位数字:");
System.out.println(RandomStringUtils.randomNumeric(4));
}
}
以下是公用库:commons-lang-2.1.jar
下载文件
http://commons.apache.org/ 这是apache commons官方网站。
我个人建议,应该好好学习这个第三库,它是对Java基础库的非常好的补充。
例如随机产生指定位数的方法:
import org.apache.commons.lang.RandomStringUtils;
/**
*
* @author www.cujava.com
* 产生随机数的方法。
*
*/
public class Test {
public static void main(String[] args) {
System.out.print("动态的四位数字:");
System.out.println(RandomStringUtils.randomNumeric(4));
}
}
以下是公用库:commons-lang-2.1.jar
下载文件http://commons.apache.org/ 这是apache commons官方网站。
我个人建议,应该好好学习这个第三库,它是对Java基础库的非常好的补充。
DWR详细练习代码(Free DWR code)
[
2007/12/07 17:58 | by fubin ]
2007/12/07 17:58 | by fubin ]
为什么Java程序员不重视程序效率?
[
2007/11/01 23:35 | by fubin ]
2007/11/01 23:35 | by fubin ]
这几天朋友议论的话题是:Java程序员不重视程序效率?
其实我觉得这个问题本来就是有问题的,因为我不认为Java程序员都不注重效率,至少我身边的朋友不会,我也不会。
由于我4年前都是从Tubor C走过来的,我能体会到一些老程序员的想法。但现在Java语言都是面对对象的语言了。也就是说,现在计算机语言越来越重视从宏观上的设计而不重视专牛角尖了。如果一定要在一个平台上提高效率那我认为应该直接使用汇编,或者直接使用机器语言。然而现在由于计算机速度的不断提高,牺牲效率获取更快的开发应该是可行的,也是必然的。
我不同意这个观点原因还有:系统运行效率固然是重要的,但是开发效率呢?开发效率不是效率吗?明显面对对象的开发显然是比面对过程的开发效率要高出很多的。
总而言之,今是不同往日,不要老是以一些就的标准评论现在的思维。。。
其实我觉得这个问题本来就是有问题的,因为我不认为Java程序员都不注重效率,至少我身边的朋友不会,我也不会。
由于我4年前都是从Tubor C走过来的,我能体会到一些老程序员的想法。但现在Java语言都是面对对象的语言了。也就是说,现在计算机语言越来越重视从宏观上的设计而不重视专牛角尖了。如果一定要在一个平台上提高效率那我认为应该直接使用汇编,或者直接使用机器语言。然而现在由于计算机速度的不断提高,牺牲效率获取更快的开发应该是可行的,也是必然的。
我不同意这个观点原因还有:系统运行效率固然是重要的,但是开发效率呢?开发效率不是效率吗?明显面对对象的开发显然是比面对过程的开发效率要高出很多的。
总而言之,今是不同往日,不要老是以一些就的标准评论现在的思维。。。



