第六条:避免创建不必要的对象
一、概述
- 1、创建对象的时候,优先考虑静态工厂方法
- 2、优先使用基本数据类型(
int、long、double、float、numbet、boolean
) - 3、对于昂贵的对象,尽量重用;但是对于小对象,我们要相信现代JVM的垃圾回收器。
作者说: 本条提及的当你应该重用现有对象的时候,请不要创建对象,却在第50条说当你应该创建新对象的时候,请不要重用现有的对象。
作者还说 : 因重用对象付出的代价,远远大于因创建重复对象付出的代价。
二、例子
1、String的没必要实例
String s=new String ("string");
String s="string";
- 显而易见,第一行语句多了一个
"string"
的String对象,可想而知这些循环中就会产生很多不必要的String实例
2、重复使用正则Pattern实例
"string".matches("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
- 使用String.matches方法是最简单的正则判断
- 在底层源码中,每次正则匹配都会产生一个Pattern实例
- 对于同一个正则表达式,Pattern实例相同的,以下代码就对这个正则就行复用。
private static final Pattern ROMAN = Pattern.compile(
"^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
static boolean isRomanNumeralFast(String s) {
return ROMAN.matcher(s).matches();
}
3、优先使用基本类型
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
- 自动装箱惹的祸
- 自动装箱使得基本类型(
int
)和装箱基本类型(Integer
)的区别变得模糊,但是不能完全消除 - 效率问题,在以上代码中,
long sum
和Long sum
的区别在与运算的时候,sum+=i
会产生大量的Long
实例,而long不会,导致出现大量的没必要的对象 - 要优先的使用基本数据类型