序言

总而言之,最好能重复的使用单个对象,而不是在每次需要创建的时候就创建一个相同功能的对象。如果对象是不可变的,它就可以被重用。

提取常量

比如以下这种情况

  1. static boolean isSixToEight(String str) {
  2. return str.matches("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$");
  3. }

str.matches 看似没毛病,但是在matches 内部其实是有创建一个 Pattern的一个实例,这样就导致了额外的内存开销。然后让我们换一种写法

  1. public static final Pattern SIXTOEIGHT = Pattern.compile("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$");
  2. static boolean isSixToEight(String str) {
  3. return SIXTOEIGHT.matcher(str).matches();
  4. }

这样呢就会在类加载的时候创建一个 Pattern 对象,不需要在重复的去创建 Pattern 所以执行速度会明显的提升。

注意拆装箱

我们以一串代码为示例

  1. private static long sum() {
  2. Long sum = 0L;
  3. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  4. sum += i;
  5. }
  6. return sum;
  7. }

代码看似没毛病,却有很大的问题,这里呢 使用了 long 的包装类 Long ,在进行 +=操作的时候,相当于做了 2
个多余的Long 实例。唉 你只需要把Long改为 long,运行速度将得到飞速的提升。
要优先使用基本类型,而不是包装类型,要当心无意识的自动装箱。
这里要说一下java中的集合,虽然有泛型,但是是无法使用基本类型的,可以去使用 joda-collection来解决。
此外在java8的 stream中也提供了 原生的流操作。

注意

不要错误的认为,创建对象的代价非常昂贵,这里呢仅仅是说明不要创建那些没有必要创建的对象。