《Practical Java》学习笔记(一)

 

一、 General Techniques

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

2、  对于不变的 data object 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 type primitive 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>

8 java.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>

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

不要每逢出错的使用 try catch;<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, 再考虑 ArrayList Vector ,如果不需要 vector 的同步特性,考虑使用 ArrayList<o:p></o:p>

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

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

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

你可能感兴趣的:(java,算法)