序言
总而言之,最好能重复的使用单个对象,而不是在每次需要创建的时候就创建一个相同功能的对象。如果对象是不可变的,它就可以被重用。
提取常量
比如以下这种情况
static boolean isSixToEight(String str) {
return str.matches("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$");
}
str.matches 看似没毛病,但是在matches 内部其实是有创建一个 Pattern的一个实例,这样就导致了额外的内存开销。然后让我们换一种写法
public static final Pattern SIXTOEIGHT = Pattern.compile("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$");
static boolean isSixToEight(String str) {
return SIXTOEIGHT.matcher(str).matches();
}
这样呢就会在类加载的时候创建一个 Pattern 对象,不需要在重复的去创建 Pattern 所以执行速度会明显的提升。
注意拆装箱
我们以一串代码为示例
private static long sum() {
Long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
代码看似没毛病,却有很大的问题,这里呢 使用了 long 的包装类 Long ,在进行 +=操作的时候,相当于做了 2
个多余的Long 实例。唉 你只需要把Long改为 long,运行速度将得到飞速的提升。
要优先使用基本类型,而不是包装类型,要当心无意识的自动装箱。
这里要说一下java中的集合,虽然有泛型,但是是无法使用基本类型的,可以去使用 joda-collection来解决。
此外在java8的 stream中也提供了 原生的流操作。
注意
不要错误的认为,创建对象的代价非常昂贵,这里呢仅仅是说明不要创建那些没有必要创建的对象。