Practical Java(重点版)之一般技术

 

以下是学习《Practical Java(重点版)》的笔记。

1.   java的方法参数传的都是值,而不是引用,传的对象其实是地址的值。所谓的java传引用是错误的说法,在C#中才有传引用的说法。

2.   对不变的数据和对象引用使用final。

1)不变的原生态数据类型设置final,如:

public class Test2 {

    public static final int A = 3;

 

    public static void main(String[] args) {

       Test2.A = 4;//报错,常量不能够再重新设置

    }

}

2)对对象引用设置final,如:

public class Test2 {

    public static final A a = new A();

 

    public static void main(String[] args) {

       a.x = 10;

       System.out.println(a.x);

       a.x = 12;

       System.out.println(a.x);

 

    }

}

 

class A {

    int x;

 

    public A() {

    }

}

此时A对象中的x值是改变了。

public class Test2 {

    public static final A a = new A();

 

    public static void main(String[] args) {

       a = new A();//报错,是因为a是一个常量对象,不能够在指向其他对象了。

    }

}

总之,如果对对象引用加final的话,是指该引用不能够再指向其他的对象了,但是指向的对象里面的值是可以改变的。

3.  在缺省的情况下非private、非静态方法都可以被子类覆写。如果想阻止子类覆写父类方法,可以将父类的方法加final关键字。如果子类覆写了父类的final方法时,在编译会出现“不能够覆写父类的方法”异常。如果将类加final时,这该类没有子类,编译会报错。

4. 对Vectors和arrays要慎重选择

Java arrays(数组)是一个对象引用,它里面既可以放原生态类型,也可以放对象。放原生态类型时,有默认值;放对象时,并不会调用类的默认构造方法,而是放的null。Java arrays不能够超出数组的大小,否则会出现数组越界异常。

Java vector没有大小限制,当元素被增加或删除时,其内部元素会移动,以确保大小合适。Java vector只能够放对象引用,不能够放基本类型(但从jdk1.5开始有自动装箱功能,不存在放基本类型问题,因为基本类型就自动装箱了)。Vector的底层还是一个array实现。

array 和Vector 的比较

 

支持基本类型

支持对象引用

自动改变大小

速度

Array

Y

Y

N

Y

Vector

N

Y

Y

N

5.  多态(polymorphism)优于instanceof。在java中使用instanceof是为了在运行期间期确定[某个对象隶属哪个class]。在多数情况下,可以使用polymorphism避免使用instanceof,这样可以提供程序的面向对象纯度,使程序扩展较好。

1)  如果必须使用instanceof来判断使用哪个子类的时候,请考虑是否将其接口是否可以增加一个方法,达到通用的目的。

2)  当看到instanceof的时候,请考虑设计上的问题,尽量避免使用它。

6. 必要时才使用instanceof

为了避免转型异常,可以使用以下方法:

  1.使用try/catch,处理ClassCastExceptio

  2. 使用instanceof

7.  一旦不需要对象引用时,就设置为null。Java垃圾回收机制负责回收不再使用的内存。即使垃圾回收器执行起来,也并非所有[不再被引用](unreferenced)的内存都可被回收。通过[查询可用内存、调用System.gc()、再查询可用内存]的步骤,你可以推测你的JVM 所用的垃圾回收器的某些行为:

Runtime r = Runtime.getRuntime();

long freeM = r.freeMemory();

System.out.println(freeM);

System.gc();

freeM = r.freeMemory();

System.out.println(freeM);

当程序调用System.gc()时,绝大多数JVM 实现品的响应都是执行垃圾回收器。此外,如果内存可用量过低,或CPU 在一段时间内处于空闲状态时,大多数JVM 也会隐式(自动地)调用垃圾回收器。多长久的空闲才会引发垃圾回收器被调用呢?这取决于JVM 所采用的垃圾回收算法.

检阅代码时,请注意大块头对象,尤其是那些存在于完整(或大部分)程序生命中的对象。你应该仔细研究这些对象的建立和运用,以及它们可能引用多少内存。如果它们引用了大量内存,请确定是否所有那些内存在对象生命期内都真的被需要。也许某些大块头对象可以解甲归田,从而使其后执行的代码能够更高效地运行任何时刻你都可以通过system.gc()要求垃圾回收器起身行动。如果想将一个对象解除引用(unreference),则可以通过调用System.gc()要求垃圾回收器立刻运转,在代码继续执行前先回收被解除引用的那块内存。但是你应当仔细考量这种做法为你的程序性能带来的潜在影响许多垃圾回收算法会在它们运转之前先虚悬(suspend)其他所有线程 (threads)这种做法可以确保一旦垃圾回收器开始运转,就能够拥有heap 的完整访问权,可以安全完成任务而不受其他线程的威胁。一旦垃圾回收器完成了任务,便恢复(resume)此前被虚悬的所有线程。因此,通过System.gc()显示调用,要求垃圾回收器起而运行,你得冒[因执行回收工作而带来延迟]的风险,延迟程序取决于JVM 所采用的垃圾回收算法。

1 ㆒般技術(General Techniques) 1 實踐1:引數以by value方式而非by reference方式傳遞1 實踐2:對不變的data和object reference 使用final 3 實踐3:缺省情況㆘所有non-static函數都可被覆寫6 實踐4:在arraysVectors 之間慎重選擇7 實踐5:多態(polymorphism)優於instanceof 11 實踐6:必要時才使用instanceof 15 實踐7:㆒旦不再需要object references,就將它設為null 18 目錄 Practical Java viii 2 對象與相等性(Objects and Equality) 25 實踐8:區分reference type 和primitive type 25 實踐9:區分== 和 equals() 29 實踐10:不要倚賴equals()的缺省實現33 實踐11:實現equals()時必須深思熟慮 43 實踐12:實現equals()時優先考慮使用getClass() 44 實踐13:調用super.equals()以喚起base class 的相關行為47 實踐14:在equals()函數㆗謹慎使用instanceof 51 實踐15:實現equals()時需遵循某些規則 60 3 異常處理(Exception Handling) 61 實踐16:認識「異常控制流」(exception control flow)機制 62 實踐17:絕對不可輕忽異常(Never ignore an Exceptions) 65 實踐18:千萬不要遮掩異常(Never hide an Exceptions) 68 實踐19:明察throws子句的缺點 73 實踐20:細緻而全面㆞理解throws子句 74 實踐21:使用finally避免資源洩漏(resource leaks) 77 實踐22:不要從try block㆗返回 79 實踐23:將try/catch block置於循環(loop)之外 81 實踐24:不要將異常(exceptions)用於流程控制84 實踐25:不要每逢出錯就使用異常(exceptions) 85 實踐26:在構造函數(constructors)㆗拋出異常86 實踐27:拋出異常之前先將對象恢復為有效狀態(valid state) 88 目錄 Practical Java ix 4 性能(Performance) 97 實踐28:先把焦點放在設計、數據結構和算法身㆖99 實踐29:不要倚賴編譯期(compile-time)優化技術 101 實踐30:理解運行期(runtime)代碼優化技術105 實踐31:如欲進行字符串接合,StringBuffer優於String 107 實踐32:將對象的創建成本(creation cost)降至最小 109 實踐33:慎防未用㆖的對象(unused objects) 114 實踐34:將同步(synchronization)減至最低 116 實踐35:儘可能使用stack變量 122 實踐36:使用static、final和private函數以促成inlining 126 實踐37:instance變量的初始化㆒次就好 127 實踐38:使用基本型別(primitive types)使代碼更快更小 130 實踐39:不要使用Enumeration或Iterator來遍歷Vector 135 實踐40:使用System.arraycopy()來複製arrays 136 實踐41:優先使用array,然後才考慮Vector和ArrayList 138 實踐42:儘可能復用(reuse)對象 141 實踐43:使用緩式評估(延遲求值,lazy evaluation) 144 實踐44:以手工方式將代碼優化151 實踐45:編譯為本機代碼(Compile to native code) 159 5 多線程(Multithreading) 161 實踐46:面對instance函數,synchronized鎖定的是 對象(object)而非函數(method)或代碼(code) 162 目錄 Practical Java x 實踐47:弄清楚synchronized statics函數與synchronized instance函數 之間的差異 166 實踐48:以「private數據 + 相應訪問函數(accessor)」替換 「public/protected數據」 170 實踐49:避免無謂的同步控制173 實踐50:訪問共享變量時請使用synchronized或volatile 176 實踐51:在單㆒操作(single operation)㆗鎖定所有用到的對象180 實踐52:以固定而全局性的順序取得多個locks(機鎖) 以避免死鎖(deadlock) 181 實踐53:優先使用notifyAll()而非notify() 185 實踐54:針對wait()和notifyAll()使用旋鎖(spin locks) 187 實踐55:使用wait()和notifyAll()替換輪詢循環(polling loops) 191 實踐56:不要對locked object(㆖鎖對象)之object reference 重新賦值 194 實踐57:不要調用stop()或suspend() 197 實踐58:通過線程(threads)之間的協作來㆗止線程198 6 類與接口(Classes and Interfaces) 201 實踐59:運用interfaces支持多重繼承(multiple inheritance) 201 實踐60:避免interfaces㆗的函數發生衝突 206 實踐61:如需提供部分實現(partial implementation), 請使用abstract classes(抽象類) 209 實踐62:區分interface、abstract class 和concrete class 212 實踐63:審慎㆞定義和實現immutable classes(不可變類) 213 實踐64:欲傳遞或接收mutable objects(可變對象)之object references 時,請實施clone() 215 實踐65:使用繼承(inheritance)或委託(delegation)來定義 immutable classes(不可變類) 226 目錄 Practical Java xi 實踐66:實現clone()時記得調用super.clone() 233 實踐67:別只倚賴finalize()清理non-memory(內存以外)的資源 235 實踐68:在構造函數內調用non-final函數時要當心 238
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值