【Effective Java】条5:避免创建不必要的对象

在代码Review的时候,也许你老大会告诉你,字符串创建要放到循环之外。

for(int i = 0; i < length; i++) {
    String s = new String(i);
}

为什么呢?

因为在循环的时候,创建了太多的临时对象。每一次循环,都需要new String(),并赋值给新的对象s。我们可以作如下改进:

String s;
for(int i = 0; i < length; i++) {
    s = String.valueOf(i);
}

这样避免每次循环都要创建对象字符串s

Java中还有很多其他的地方都有这些小细节:
1. 还记得【Effective Java】条1:考虑用静态工厂方法代替构造器1中给出的Boolean案例吗?

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

相比于new Boolean(String s)构造方法,valueOf方法返回的TRUEFALSE都是内置的对象,并不是和构造方法一样,每调用一次就会新建个Boolean对象。

==所以,以后看到类同时有构造函数和静态构造方法时,查看下静态构造方法的实现,也许可以节省很多资源。==

  1. HashMapkeySet方法,返回的是Map中所有keySet形式。查看下代码,你会发现这里的Set其实就是AbstractMap中的成员变量。
  2. Java中还有种情形下会隐式的创建不必要的对象。大家都知道intIntegerlongLong可以相互转换(自动装箱和拆箱)。譬如:
public static void main(String[] args) {
    Long sum = 0L;
    for (long i = 0; i < Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

这段代码没有问题,但是中间隐藏了创建笔不要的对象。由于sum声明为Long类型,所以每次循环操作都需要将sum转为Long类型,增加了对象的创建。其实,只需要将Long sum = 0L改为long sum = 0L即可。

==所以,在程序开发中,尽量避免使用基本类型和装箱类型的交互操作,防止创建不必要的对象。==

说了这么多,其实不是让大家在开发中避免创建对象。其实对于绝大部分的对象都是可以直接创建,只是在循环、装箱操作、以及对象创建非常耗时等过程中需要注意,避免浪费不必要浪费的资源。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值