《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()方法