这十条代码优化法则,如果都注意到了,程序效率将提升N倍

这十条代码优化法则,如果都注意到了,程序效率将提升N倍

(1)静态类、单例类、工厂类将它们的构造函数置为private

这是因为静态类、单例类、工厂类这种类本来我们就不需要外部将它们new出来,将构造函数置为private之后,保证了这些类不会产生实例对象。

(2)使用最有效率的方式去遍历Map

遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是:

public static void main(String[] args)

{ HashMap hm = new HashMap(); hm.put("111", "222"); Set> entrySet = hm.entrySet(); Iterator> iter = entrySet.iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); System.out.println(entry.getKey() + "\t" + entry.getValue()); }

}
如果你只是想遍历一下这个Map的key值,那用"Set keySet = hm.keySet();"会比较合适一些



(3)不要对数组使用toString()方法

看一下对数组使用toString()打印出来的是什么:

public static void main(String[] args){ int[] is = new int[]{1, 2, 3}; System.out.println(is.toString());}

结果是:

[I@18a992f

本意是想打印出数组内容,却有可能因为数组引用is为空而导致空指针异常。不过虽然对数组toString()没有意义,但是对集合toString()是可以打印出集合里面的内容的,因为集合的父类AbstractCollections重写了Object的toString()方法。

(4)long或者Long初始赋值时,使用大写的L而不是小写的l,因为字母l极易与数字1混淆,这个点非常细节,值得注意

(5)程序运行过程中避免使用反射

关于,请参见反射。反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法,如果确实有必要,一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存----用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。

这十条代码优化法则,如果都注意到了,程序效率将提升N倍

(6)切记以常量定义的方式替代魔鬼数字,魔鬼数字的存在将极大地降低代码可读性,字符串常量是否使用常量定义可以视情况而定

(7)不要创建一些不使用的对象,不要导入一些不使用的类

这毫无意义,如果代码中出现"The value of the local variable i is not used"、"The import java.util is never used",那么请删除这些无用的内容

(8)所有重写的方法必须保留@Override注解

这么做有三个原因:

(1)清楚地可以知道这个方法由父类继承而来

(2)getObject()和get0bject()方法,前者第四个字母是"O",后者第四个子母是"0",加了@Override注解可以马上判断是否重写成功

(3)在抽象类中对方法签名进行修改,实现类会马上报出编译错误

(9)尽量重用对象

特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。

(10)尽量指定类、方法的final修饰符

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。

这十条代码优化法则,如果都注意到了,程序效率将提升N倍

(11)避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数

解释一下竞争同一个seed导致性能下降的原因,比如,看一下Random类的nextInt()方法实现:

 1 public int nextInt() { 2 return next(32); 3 }

调用了next(int bits)方法,这是一个受保护的方法:

1 protected int next(int bits) {2 long oldseed, nextseed;3 AtomicLong seed = this.seed;4 do {5 oldseed = seed.get();6 nextseed = (oldseed * multiplier + addend) & mask;7 } while (!seed.compareAndSet(oldseed, nextseed));8 return (int)(nextseed >>> (48 - bits));9 }

而这边的seed是一个全局变量:

1 /**2 * The internal state associated with this pseudorandom number generator.3 * (The specs for the methods in this class describe the ongoing4 * computation of this value.)5 */6 private final AtomicLong seed;

多个线程同时获取随机数的时候,会竞争同一个seed,导致了效率的降低。


分享到:


相關文章: