Practical Java 学习笔记

《Practical Java》确实是一本值得一看的好书,建议和《Effective Java》对比着看,以前也写过一个《Effective Java》的学习笔记,但是由于换了硬盘,东西全没了。-_-

一般和异常
1.JVM中的三种内存
堆内存,栈内存,永久内存

所有的对象都生成在堆内存中
所有的引用和局部的基本类型变量都放生成在栈内存中
所有的类结构信息和静态变量都生成在永久内存中

栈内存是以线程为单位的,一个线程如果开启,就为这个线程开辟一个栈空间,如果该线程结束。那么就释放该线程的栈内存空间。需要注意的是,一个方法返回之后,这个方法所用到的局部变量并不是立刻就被销毁的。

2.Class 的 equals 没有被重写

3.instanceof可以反映出父子关系,反映的是一个is-a的关系。所以在equals中使用instanceof可能会有陷阱,很可能会违反 if(a.equals(b)) 那么必然存在 b.equals(a)的相等对称性

4.异常发生后程序的三种去向
  1)catch块
  2)finally块
  3)调用端
注意:异常是方法返回的一种方式,所以异常发生以后,方法就应该被中断了,除非用了catch恢复。

5.要在设计初期确定好异常的处理策略。因为如果在编码阶段完成后,发现某个方法会抛出一个新的异常,那么这一改动将波及所有调用该方法的方法链。这样一来,这个改动很可能成为影响不可预计的变动。

6.不要在try中return。因为如果存在finally块,且在finally块中也有return语句,那么将按finally中的return返回值。这可能会造成陷阱。

性能
个人认为这些所谓的性能的提升都是代码级上的,对JAVA来说,这些都不太可能成为提升性能的关键点。还是必须从设计架构上找问题。对于JAVA程序来说,结构的灵活性永远比性能要重要。

1.使用StringBuffer来拼接字符串
注意:在创建StringBuffer时候应该指定长度,因为StringBuffer自动增加长度的操作是十分消耗资源的

2.对象创建的性能和销毁造成的开销很可能成为性能瓶颈
对象创建时做了以下的事
1)为成员变量分配内存空间
2)初始化成员变量
3)调用构造器,并沿继承链自上而下创建父类的子对象。
4)创建本身的对象
注意:创建和销毁对象的性能开销跟两方面有关系:一、继承链的长度;二、对象的成员变量的重量

3.增加对象创建成本的3种code
1)构造函数体积庞大
2)内含数据众多或体积庞大的成员变量
3)太深的继承层次

4.同步化对性能的影响是比较大的,所以要将同步化控制在最小的范围内(当然必须要同步化的地方还是要同步的)

5.尽可能使用栈变量(不用说的,栈变量的访问效率是最好的)

6.使用System.arrayCopy()方法来复制数组

7.有限使用数组,然后再考虑List

8.使用对象成员变量的延迟加载

不可变类

1.不可变类的5个规则(少了任何一个都可能会出现陷阱)
1)声明这个class是final
2)声明所有的数据为private
3)只提供get方法,不提供set方法
4)在构造函数中设置所有的instance数据
5)根据情况实现克隆

2.深复制和浅复制,对象复制和引用复制
这一块没怎么搞明白

3.实现clone时必须调用Object的clone()方法 

  • 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、付费专栏及课程。

余额充值