高效程序员的几个编程小习惯(一)----变量,对象的创建与使用

     尽管编程风格这种东西因人而异,但是养成对编译器和程序友好的编程习惯还是很重要的。在Java这个名词王国里,变量和对象的地位是非常基础而重要的,尤其是对象,创建是耗时和耗存的。如果我们能在使用变量和对象的时候稍微注意点,积少成多,我们的程序就不会跑着跑着就“当”了。

一尽量避免使用静态变量

     很多时候我们之所以创建静态变量,是因为我们想要一个与整个类的生命周期一样长的变量,这通常都是声明一个静态全局变量,很少有在一个方法中声明静态变量(这样做通常认为是错误),而且,静态变量并不会在程序结束后被垃圾回收器回收。如果我们的程序中有太多的静态变量,你就要好好思考,到底是否真的有必要是静态变量,尤其是那种明明只是使用一次的变量,尽量减少内存的消耗。

二尽量避免过多建立对象
      正如上面指出,对象的创建是一种“消费行为”,所以,new必须慎重。我们很容易在一个循环中new一个对象,还有在经常被调用的方法中new对象,这样会使系统花费更多时间来创建对象,还要花时间清理这些对象,忙得不可开交,尤其是大量对象的循环创建,那真的是一种灾难!学会最大程度的复用对象已经是每个高效程序员应该具备的基本能力,最好就是用基本数据类型和数组来代替对象(因为封装,使得新手大量封装对象,明明就只是几个数据而已,还要封装进一个对象,然后频繁使用这个对象)。
三尽量使用局部变量
       栈(Stack)的创建要比堆(Heap)快得多,所以我们应该尽量使用局部变量,其他变量,像是静态变量和实例变量等等,都是在堆中创建,所以,我们应该在方法中创建它们需要使用的变量而不是外部创建然后传参。
四尽量处理好包装类型和基本类型两者的使用场所
      包装类型和基本类型在使用过程中的确是可以相互转换,但产生它们两者的内存区域是完全不同的。基本类型数据的产生和处理都在栈中,包装类型是对象,是在堆中产生实例。所以,我们应尽量使用基本类型,除非在集合类对象中,像是容器类List,Map,就需要包装类。
五尽量使用基本数据类型代替对象
    举个例子,像是
    String str = "hello"
这种方式会创建一个"hello"字符串,JVM的字符缓冲池会缓冲这个字符串,
    String str = new String("hello")
除了创建字符串外,str所引用的String对象底层还会包含一个char[]数组依次存放h,e,l,l,o。
看到没,仅仅只是创建方式的小小不同,但是意义却完全不一样。
六尽量减少对变量的重复计算 
    依然是在循环中常常会犯这样的错误,如我们经常会这样写:
    for(int i = 0; i < list.size(); i++){}
这样就是对变量的重复计算!因为每次循环的时候都会重新计算一次list.size(),所以我们应该这样改:
    for(int i = 0, len = list.size(); i < len; i++){}
循环中应该竭力避免使用复杂的表达式,因为循环是影响我们程序速度的重要因素之一。
七尽量避免不必要的创建
    这个针对的又是作用域的问题,像是这样的例子:
    A a = new A();
    if(i == 0){
       list.add(a);
    }
就应该这样改:
    if(i == 0){
       A a = new A();
       list.add(a);
    }
这就提醒我们,在写完一个逻辑块,像是条件语句或者循环语句,必须时时注意变量的作用域问题,它到底是哪个部分的逻辑,必须封装好,“逻辑外漏”很多时候并不会出现问题,但是一旦出现问题却很难发现。
八尽量早释放无用对象的引用
    java中释放对象引用的一个方法就是将这个引用设置为null,大多数情况下,方法内创建的对象引用我们不需要显式的将它释放,因为随着方法的结束它就会被回收,但是,如果这个方法中执行的是耗时耗存的动作,就有必要考虑将引用释放,因为这个无用对象的引用会在操作期间长期占据着内存,像是这样:
Public void test(){ 
      Object obj = new Object(); 
      …… 
     Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
}
如果是C++,C出身的程序员,应该早就有时时释放引用的习惯。
九尽量避免使用二维数组
     二维数据占用的内存空间比一维数组多得多,大概10倍以上,能不使用则不使用,不要以为你能想到二维数组就说明你很聪明,恰恰相反,在自己的代码中使用二维数组往往意味着错误。
十尽量避免非常大的内存分配
     有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的,分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难,所以在我们分配内存的时候不要随便就分配一个非常大的内存。
posted @ 2012-11-02 16:00  文酱  阅读(964)  评论(0编辑  收藏  举报