《Practical Java》学习笔记(一)

 

一、 General Techniques

1、  引数以 by value 方式而非 by reference 方式传递

2、  对于不变的 dataobject reference 使用 final ,final 仅仅令 object reference 自身成为不变量,但并不限制它所指向对象的改变

3、  缺省情况下,所有 non-static 都可以被覆写,不然 , 则用 final 防止覆写

4、  vector 容器包含的是对象,与 arrays 要区别,但我认为 Vector 的功能实际上有些像跟 Array List 差不多,只是 vector 现在不经常使用

5、  多态优于 instanceof ,只有在不得已的情况下使用

“如果你根据对象的型别来触发行为,那就改给自己一个耳光”

例如,当你必须从一个 base type 做向下转型为 derived type 的时候,必须使用它

….

Vector shapeVector = new Vector(10);<o:p></o:p>

shapeVector.add(new Triangle());<o:p></o:p>

shapeVector.add(new Triangle());<o:p></o:p>

shapeVector.add(new Circle());<o:p></o:p>

    //...<o:p></o:p>

    //Assume many Triangles and Circles are added and removed<o:p></o:p>

    //...<o:p></o:p>

    int size = shapeVector.size();<o:p></o:p>

    for (int i=0; i<size; i++)<o:p></o:p>

    {<o:p></o:p>

      Object o = shapeVector.get(i);<o:p></o:p>

      if (o instanceof Triangle)<o:p></o:p>

      {<o:p></o:p>

        if (((Triangle)o).isRightTriangle())<o:p></o:p>

        {<o:p></o:p>

          //...<o:p></o:p>

        }<o:p></o:p>

      }<o:p></o:p>

      else if (o instanceof Circle)<o:p></o:p>

      {<o:p></o:p>

        double rad = ((Circle)o).radius();<o:p></o:p>

        //...<o:p></o:p>

      }<o:p></o:p>

}<o:p></o:p>

         6 、一旦不需要对象的引用,就将它设为 null <o:p> </o:p>

       尽管有 GC, 你还是要关注的你的代码如何运用内存; <o:p> </o:p>

         <o:p> </o:p>

<o:p> </o:p>

二、  对象与相等性 <o:p> </o:p>

7 、区分 reference typeprimitive type ,理解他们的差异,你会在运用他们时候做出明智的 <o:p> </o:p>

选择; <o:p> </o:p>

         Boolean(boolean)<o:p></o:p>

         Character(char)<o:p></o:p>

Byte(byte)<o:p></o:p>

Integer(int)<o:p></o:p>

Float(float) <o:p></o:p>

Long(long)<o:p></o:p>

Short(short)<o:p></o:p>

Double(double)<o:p></o:p>

基本型别相等,只要是值相等就可以拉,不管是不是同一类型;而引用类型必须则按照引用的比较方式来比较,譬如 equals();<o:p></o:p>

<o:p> </o:p>

8java.lang.object 提供的 equals() 方法很多时候不是你想要的,你需要自己写一些比较的方法 <o:p> </o:p>

public boolean equals(Object obj)<o:p></o:p>

  {<o:p></o:p>

<o:p> </o:p>

    if (this == obj)<o:p></o:p>

      return true;<o:p></o:p>

<o:p> </o:p>

    if (obj != null && getClass() == obj.getClass())<o:p></o:p>

    {<o:p></o:p>

      Golfball gb = (Golfball)obj;  //Classes are equal, downcast.<o:p></o:p>

      if (brand.equals(gb.brand()) &&  //Compare attributes.<o:p></o:p>

          make.equals(gb.make()) &&<o:p></o:p>

          compression == gb.compression())<o:p></o:p>

      {<o:p></o:p>

        return true;<o:p></o:p>

      }<o:p></o:p>

    }<o:p></o:p>

    return false;<o:p></o:p>

  }<o:p></o:p>

<o:p> </o:p>

三、  java 异常 <o:p> </o:p>

1、   try,cacth,finally<o:p></o:p>

<o:p> </o:p>

不要将 catch 的异常覆盖掉,在这样的情况下,我们要专门把异常保存下来,如用一个 vector 保存; <o:p> </o:p>

不要忽略任何一个异常,因为异常一旦出现,抛出异常的那个线程将会终止; <o:p> </o:p>

将一个异常加入到 throw 子句,会影响到调用它的所有函数 <o:p> </o:p>

使用 finally 防止资源泄露,譬如在连接数据库的时候在 finally 中关闭连接; <o:p> </o:p>

不要从 try 字段中返回; <o:p> </o:p>

不要用 trycatch 用于流程控制 ;<o:p></o:p>

不要每逢出错的使用 trycatch;<o:p></o:p>

不要在构造函数中抛出异常; <o:p> </o:p>

抛出异常前,请将对象置为有效状态; <o:p> </o:p>

四、  性能 <o:p> </o:p>

1、   先把焦点放在设计,数据机构和算法方面 <o:p> </o:p>

2、   如果进行字符串的拼接,用 String Buffer String 快许多倍 <o:p> </o:p>

3、   在面向对象中,对象的创建是昂贵的,因此需要将对象的创建成本降到最低,减少一些没有必要的对象,在非必要的时候,别产生你的对象 <o:p> </o:p>

4、   将同步减少到最低,增加 stack 的使用 <o:p> </o:p>

5、   使用基本型别代码会更快 <o:p> </o:p>

6、   在使用 vector 时候,用 get() 来获取对象,而不是 Interator<o:p></o:p>

7、   优先使用 array, 再考虑 ArrayListVector ,如果不需要 vector 的同步特性,考虑使用 ArrayList<o:p></o:p>

8、   尽可能的重复使用对象,这比重新创建对象更有效 <o:p> </o:p>

9、   使用缓式评估,延迟计算,不必要的计算永远都不要计算 <o:p> </o:p>

10、 手动优化你的代码,特别是执行的顺序 <o:p> </o:p>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 ㆒般技術(General Techniques) 1 實踐1:引數以by value方式而非by reference方式傳遞1 實踐2:對不變的data和object reference 使用final 3 實踐3:缺省情況㆘所有non-static函數都可被覆寫6 實踐4:在arrays 和Vectors 之間慎重選擇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、付费专栏及课程。

余额充值