1.定时器Timer类
构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做什么操作。定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的ActionListener接口
例:
Class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event ) { Date now = new Date(); System.out.println(now); } } ActionListener listener = new TimePrinter(); Timer t=new Timer(1000,listener); t.start();
2.局部类final变量做计数器
使用一个长度是1的数组做计数
final int[] count =new int[1]; for(int i=0;i<dates.length;i++) dates[i]=new Date() { public int compareTo(Date other) { counter[0]++; return super.compareTo(other); } };
3.抛出原始异常
在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型。如需抛出高级异常,而不丢失原始异常的细节,可使用:
try{ access the database }catch(SqlException e){ Throwable se =new ServletException(“database error”); se.initCause(e); throw se; }
4.finally语句中异常的处理
finally中的语句可能出现异常时,建议独立使用try/catch 和try/finally语句块,这样可以提高代码的清晰度。例如:
InputStream in= … try{ try{ code that might throw exceptions }finally{ in.close(); } }catch(IOException e){ Show error dialog }
内层的try语句块只有一个职责,就是确保关闭输入流。外层的try语句块也只有一个职责,就是确保报告出现的错误。这种设计方式不仅清楚,而且还具有一个功能,就是将会报告finally中出现的错误。
5.断言
断言机制允许在测试期间向代码中插入一些检查语句。当代吗发布是,这些插入的检测语句将会被自动的移走
方式一:assert 条件 ;
方式二:assert 条件 : 表达式 ;
表达式的将被传入AssertionError的构造器,并转换成一个消息字符串。
6.泛型中变量的命名
在构造泛型时,类型变量使用大些形式,且比较短。在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值得类型。T(需要时还可以使用临近的字母U和S)表示“任意类型”
Java泛型在运行时存在一个类型擦除的过程,中间过程会将泛型擦除为Object类,因此,不能使用基本类型实例化类型参数。因此,没有Pair<double>,只有Pair<Double>
7.Iterator使用
Iterator接口的remove方法见会删除上次调用next方法时返回的元素。在大多数情况下,决定删除某个元素之前应该先看一下这个元素是很具有实际意义的。然而,如果想要删除指定位置上的元素,仍然需要约过这个元素。
例:删除字符串集合中第一个元素:
Iterator<String> it = c.iteraotr(); it.next(); it.remove();
8.Vector与ArrayList
对于一个经验丰富的Java程序员来说,在需要动态数组时,可能会使用Vector类。Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象,但是,如果由一个线程访问Vector,代码要在同步操作上耗费大量的时间。而ArrayList方法不是同步的,因此,建议在不需要同步时使用ArrayList,而不是Vector
9.线程中断异常处理
不要将InterruptedException异常抑制在很低的层次上,比如
void mySubTask(){ try{ sleep(delay);} catch(InterruptedException e){} }
这样会导致调用者无法检测或捕获这一异常。应使用以下两种方式
1) 在catch字句中调用Thread.currentThread().interrupt()来设置中断
Void mySubTask(){ try{ sleep(delay); }catch(InterruptedException e){ Thread.currentThread().interrupt(); } }
2) 更好的选择是,用throws InterrupterException标记你的方法
void mySubTask() throws InterrupterException{ sleep(delay); }
10.synchronized关键字
public synchronized voi method() { method body }
等价于
public void method(){ this.intrinsicLock.lock(); try{ method body }finally{ this.intrinsicLock.unlock(); } }
11.使用Object锁
public class Bank{ public void transfer(int from ,int to , int mount){ synchronized(lock){ accounts[from]-=amount; accounts[to]+=amount; } System.out.println(…); } private double[] account; private Object lock = new Object(); }
12.Java类库中的集合
ArrayList 一种可以动态增长和缩减的索引序列
LinkedList 一种可以在任何位置进行高效的差如何删除操作的有序序列
ArrayDeque 一种用循环数组实现的双端队列
HashSet 一种没有重复元素的无序集合
TreeSet 一种有序集
EnumSet 一种包含枚举类型值的集
LinkedHashSet 一种可以记住元素插入次序的集
PriorityQueue 一种允许高效删除最小元素的集
HashMap 一种存储键值关联的数据结构
TreeMap 一种键值有序排列的映射表
EnumMap 一种键值属于枚举类型的映射表
LinkedHashMap 一种可以记住键值项添加次序的映射表
WeakHashMap 一种其值无用后可以被垃圾回收器回收的映射表
IdentityHashMap 一种用==,而不是用equals比较键值的映射表