《java基础》慎用包装类型

217 阅读3分钟

说说闲话

愉快的五一假期马上结束了,有没有跟我一样最后一天假期是在加班中度过的呢?

我的工位
据说不加班的程序员都不是好程序员,这样说的话我一定是一个优秀且合格的程序员了(哈哈哈,自恋一下)。最近项目需要赶进度,加班是在所难免的了。

加班多的话更新文章的频率难免会下降但我尽量保证2-3天一篇。在此也谢谢大家的观看和分享。

进入正题

什么是包装类型?

java有两大数据类型体系,基本数据类型和引用数据类型。每个基本类型所对应的引用类型称为包装类型。

为什么会存在包装类型?

1、基本数据类型是无法存储null的,恰恰数据库的表中null值是普遍存在的,此时包装类型的存在就可以解决此问题。
2、包装类型除了赋值、运算、取值外还有很多其他的功能来操作基本数据类型,可以更方便程序员使用。
3、泛型中只能使用包装类型,基本数据类型是不能使用的。
4、假设现在有一个公共的方法,该方法可以打印任何数值,此时可以将该方法的入参类型设置成Object,就可以接受所有包装类型的数值。

包装类型的应用场景还是很广泛的。看完之后大家是不是跃跃欲试,想要进行尝试一下那?别急别急,包装类型也是需要慎用的。

包装类型使用注意事项:

使用包装类型进行值比较时需要注意不能使用==,需要使用equals方法。我之前写过一篇“《java基础》整型包装类之间值得比较”的文章,就不在这进行解释了。如果大家想了解的话可以翻看一下之前写的文章。本篇文章主要介绍的是使用包装类型需要注意效率相关的问题。

下面通过一段代码来了解一下当包装类型使用不当时造成程序效率下降的问题。

public static void main(String[] args) {

    // 获取开始时间
    long packingTypeStartTime = System.currentTimeMillis();
    Integer packingTypeSum = 0;
    for (int i = 0; i < 100000; i++) {
      packingTypeSum += i;
    }
    System.out.println("总和为:" + packingTypeSum);
    // 获取结束时间
    long packingTypeEndTime = System.currentTimeMillis();
    System.out.println("使用包装类型求和耗时:"
        + (packingTypeEndTime - packingTypeStartTime) + "毫秒。");

    System.out.println("========我是分割线========");

    // 获取开始时间
    long basicTypeStartTime = System.currentTimeMillis();
    int basicTypeSum = 0;
    for (int i = 0; i < 100000; i++) {
      basicTypeSum += i;
    }
    System.out.println("总和为:" + basicTypeSum);
    // 获取结束时间
    long basicTypeEndTime = System.currentTimeMillis();
    System.out.println("使用基本数据类型求和耗时:"
        + (basicTypeEndTime - basicTypeStartTime) + "毫秒。");
  }

大家知道哪个执行时间更短吗?执行结果见下图:

通过上面的代码可以看出使用包装类型和基本类型还是有一定的效率差距的。下面是反编译后的代码图片(因图片大小限制只截取了一部分的代码)。

当循环计算总和时,会频繁的进行拆装箱操作,导致明显的性能下降。


包装类型的使用应遵循以下原则:

1、所有的 POJO 类属性必须使用包装数据类型。
2、RPC(远程过程调用) 方法的返回值和参数必须使用包装数据类型。普通方法根据实际需求确定。
3、局部变量尽量使用基本数据类型,有效避免因频繁拆装箱导致的性能下载。
4、进行反射方法调用时,必须使用包装类型。

今天的分享就到这了,如果喜欢的话大家记得点赞哦!