1.无论什么时候,对于下面这种形式的代码:
if(x if of type 1)
action1(x)
else if(x is of type 2)
action2(x)
都应该考虑使用多态性。action1与action2表示的是相同的概念嘛?如果是相同的钙奶年,就应该为这个概念定义一个方法,并将其放置在两个类的超类或借口中,然后就可以调用 x.action();以便使用多态性提供的动态分派机制执行相应的动作。
2.由于很多程序猿发现大量的使用匿名内部类会让程序更加难于理解,所以,建议限制使用它。
3.StringBuilder类是 JDK 5.0新引入的。它的前身StringBuffer 的效率稍稍偏低一点,但是却可以允许多线程进行增加或移除字符操作。如果所有的字符串编辑出啊线在一个线程中,应该改用StringBuilder。这两个类的API都是相同的。
4.不要调用Tread类或Runnable对象的run方法。直接调用run方法只会在当前线程中执行任务,并不会启动新的进程,正确的做法是调用Tread.start方法,他会建立一个新的线程来执行run方法。
5.JDK5.0开始,有两种机制来保护代码块不受并行访问的干扰。旧版本的JAVA使用synchronized关键字来达到这个目的,而JDK5.0引进了ReentrantLock类。synchronized关键字自动提供了一个锁和相关的“条件”。
6.在代码中应该使用哪一种呢?Lock和Condition对象还是synchronized方法?下面是我们的建议:
- 最好既不使用Lock/Condtion也不适用synchronized关键字。在很多情况下,你可以使用java.util.concurrent包中的一种机制,它会为你处理所有的加锁。例如在本书48页,你将看到如何使用阻塞队列来同步完成一份共同任务的线程。
- 如果synchronized关键字在你的程序中可以工作,那么尽量使用它,这样可以减少你的代码数量,减少出错分几率。例1-5显示了用同步方法实现的银行实例。
- 只有在你非常需要Lock/Condition结构的独有特性的时候才使用它们。
7.Vector类的所有方法都是同步的。你可以用两个线程安全地访问Vector对象。相反,ArrayList类的方法是不同步的,因此我们建议在不需要同步时使用ArrayList而不是Vector.
8. foreach 用法
int[][] a={
{1,2,3 },
{4,5,6 },
{7,8,9 },
};
for(int[] b : a)
for(int j: b){
System.out.println(j);
}