Java学习笔记-05避免成立不必要的对象[Java编程]
本文“Java学习笔记-05避免成立不必要的对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
试对比以下两行代码在被多次反复履行时的效率差别:由于String被实现为不可变对象,JVM底层将其实现为常量池,既全部值等于"stringette" 的String对象实例同享同一对象地址,并且还可以保证,关于全部在同一JVM中运行的代码,只要他们包含相同的字符串字面常量,该对象就会被重用.
我们持续对比下面的例子,并测试他们在运行时的效率差别:
[java] Boolean b = Boolean.valueOf("true");
Boolean b = new Boolean("true");
Boolean b = Boolean.valueOf("true");
Boolean b = new Boolean("true");
前者通过静态工厂办法保证了每次返回的对象,假如他们都是true或false,那么他们将返回相同的对象.换句话说,valueOf将只会返回 Boolean.TRUE或Boolean.FALSE两个静态域字段之一.此背面的Boolean构造方法,每次城市构造出一个新的Boolean实例对象.这样在多次调用后,第一种静态工厂办法将会避免大量不必要的Boolean对象被成立,从而提高了程序的运行效率,也降低了垃圾回收的负担.
持续对比下面的代码:
[java] public class Person {
private final Date birthDate;
//判断该婴儿能否是在生养顶峰期诞生的.
public boolean isBabyBoomer {
Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(1946,Calendar.JANUARY,1,0,0,0);
Date dstart = c.getTime();
c.set(1965,Calendar.JANUARY,1,0,0,0);
Date dend = c.getTime();
return birthDate.compareTo(dstart) >= 0 && birthDate.compareTo(dend) < 0;
}
}
public class Person {
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(1946,Calendar.JANUARY,1,0,0,0);
BOOM_START = c.getTime();
c.set(1965,Calendar.JANUARY,1,0,0,0);
BOOM_END = c.getTime();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
public class Person {
private final Date birthDate;
//判断该婴儿能否是在生养顶峰期诞生的.
public boolean isBabyBoomer {
Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(1946,Calendar.JANUARY,1,0,0,0);
Date dstart = c.getTime();
c.set(1965,Calendar.JANUARY,1,0,0,0);
Date dend = c.getTime();
return birthDate.compareTo(dstart) >= 0 && birthDate.compareTo(dend) < 0;
}
}
public class Person {
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(1946,Calendar.JANUARY,1,0,0,0);
BOOM_START = c.getTime();
c.set(1965,Calendar.JANUARY,1,0,0,0);
BOOM_END = c.getTime();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
改良后的Person类只是在初始化的时刻成立Calender、TimeZone和Date实例一次,而不是在每次调用isBabyBoomer办法时都成立一次他们.假如该办法会被频繁调用,效率的晋升将会极其明显.
调集框架中的Map接口供应keySet办法,该办法每次都将返回底层原始Map对象键数据的视图,而并不会为该操作成立一个Set对象并填充底层Map全部键的对象拷贝.因此当多次调用该办法并返回差别的Set对象实例时,事实上他们底层指向的将是同一段数据的引用.
在该条目中还提到了自动装箱行为给程序运行带来的性能打击,假如可以通过原始范例完成的操作应当尽大概避免利用装箱范例以及他们之间的交互利用.见下例:
[java] public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; ++i) {
sum += i;
}
System.out.println(sum);
}
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; ++i) {
sum += i;
}
System.out.println(sum);
}
本例中由于错把long sum定义成Long sum,其效率降低了近10倍,这此中的主要缘由就是该错误招致了2的31次方个暂时Long对象被成立了.
摘自 horsttnann的专栏
以上是“Java学习笔记-05避免成立不必要的对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |