- 通过例子来看重用对象的好处
- String类型
- 当写了这样子的代码 String test = new String("123"); 的时候,实际上创建的不是一个对象,而是两个,可以由String的源码来印证,这个构造方法传入的就是一个String对象,然后把这个String的值复制了一遍,返回这个复制后的String
public String(String original) { this.value = original.value; this.hash = original.hash; }
-
当需要验证一个字符产是不是一个有效的阿拉伯数字的时候,有下边两种方式,在我的机器上第一个的输出是5,第二个的输出是1,原因是什么呢,因为调用String.matches的时候,每次都会创建一个Pattern对象,而且这个对象只使用一次就不用了,所以会重复创建这个对象
// 多点几下调用关系就可以看到这个了 public static Pattern compile(String regex) { return new Pattern(regex, 0); }
package avoidcreatingunnecessaryobjects.pattern; public class PatternTest { public static void main(String[] args) { long l = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { isRoman("123456781919191919191919191919191919191919191919191919199121321321321312321321"); } long l1 = System.currentTimeMillis(); System.out.println(l1 - l); } private static boolean isRoman(String s){ return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); } }
package avoidcreatingunnecessaryobjects.pattern; import java.util.regex.Pattern; public class PatternTest2 { 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})$"); public static void main(String[] args) { long l = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { isRoman("123456781919191919191919191919191919191919191919191919199121321321321312321321"); } long l1 = System.currentTimeMillis(); System.out.println(l1 - l); } private static boolean isRoman(String s){ return ROMAN.matcher(s).matches(); } }
- 当写了这样子的代码 String test = new String("123"); 的时候,实际上创建的不是一个对象,而是两个,可以由String的源码来印证,这个构造方法传入的就是一个String对象,然后把这个String的值复制了一遍,返回这个复制后的String
-
静态工厂对比构造器的区别在于,构造器会默认传入一个实例对象,换句话说就是每次调用构造器都会创建一个对象,静态工厂方法就不用这样子做,所以,在使用别人的类的时候如果可以使用静态工厂方法可以解决的就不要用构造器,自己写类的时候如果可以不用每次都创建对象的时候也用静态工厂方法就可以了
-
最后一个例子是自动装箱和拆箱的例子,一下两份代码,输出分别是10673,另外一个是597,差别这么大就是由于发生了自动装箱拆箱,浪费了时间
package avoidcreatingunnecessaryobjects.boxingunpacking; public class BoxingUnpackingTest { public static void main(String[] args) { sumTest(); } private static void sumTest(){ Long sum = 0L; long l = System.currentTimeMillis(); for(long i = 0; i <= Integer.MAX_VALUE; i++){ sum += i; } long l1 = System.currentTimeMillis(); System.out.println(l1 - l); } }
package avoidcreatingunnecessaryobjects.boxingunpacking; public class BoxingUnpackingTest { public static void main(String[] args) { sumTest(); } private static void sumTest(){ long sum = 0L; long l = System.currentTimeMillis(); for(long i = 0; i <= Integer.MAX_VALUE; i++){ sum += i; } long l1 = System.currentTimeMillis(); System.out.println(l1 - l); } }
effecitve java 5 当你应该重用现有对象的时候,不要创建新对象
最新推荐文章于 2023-05-27 11:18:45 发布