读书笔记-《Java核心技术卷I-基础知识》

来源:互联网 发布:淘宝上买黄牛票犯法吗 编辑:程序博客网 时间:2024/05/05 08:28
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比较键值的映射表

0 0
原创粉丝点击