返回首页
当前位置: 主页 > 编程语言 > JAVA教程 >

关于Java的基本类型与包装类型的区别

时间:2019-11-22 09:40来源:电脑教程学习网 www.etwiki.cn 编辑:小山哥
Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double。基本类型和包装类型的区别主要有以下四点。
 
一,包装类型可以为 null,而基本类型不可以
这就意味着,包装类型可以应用于 POJO 中,而基本类型则不行。POJO 的英文全称是 Plain Ordinary Java Object,翻译一下就是,简单无规则的 Java 对象,只有属性字段以及 setter 和 getter 方法,示例如下:
1.class Writer {
2. private Integer age;
3. private String name;
4.
5. public Integer getAge() {
6. return age;
7. }
8.
9. public void setAge(Integer age) {
10. this.age = age;
11. }
12.
13. public String getName() {
14. return name;
15. }
16.
17. public void setName(String name) {
18. this.name = name;
19. }
20.}
和 POJO 类似的,还有数据传输对象 DTO(Data Transfer Object,泛指用于展示层与服务层之间的数据传输对象)、视图对象 VO(View Object,把某个页面的数据封装起来)、持久化对象 PO(Persistant Object,可以看成是与数据库中的表映射的 Java 对象)。由于数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。所以POJO 的属性必须要用包装类型。
 
二,包装类型可用于泛型,而基本类型不可以
泛型不能使用基本类型,因为使用基本类型时会编译出错。
1.List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
2.List<Integer> list = new ArrayList<>();
因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类——基本类型是个特例。
 
三,基本类型比包装类型更高效
基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。
 
很显然,相比较于基本类型而言,包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。两个包装类型的值可以相同,但却不相等,看下面的代码可以得知:
1.Integer chenmo = new Integer(10);
2.Integer wanger = new Integer(10);
3.
4.System.out.println(chenmo == wanger); // false
5.System.out.println(chenmo.equals(wanger )); // true
 
两个包装类型在使用“”进行判断的时候,判断的是其指向的地址是否相等。chenmo 和 wanger 两个变量使用了 new 关键字,导致它们在“”的时候输出了 false。
而 chenmo.equals(wanger) 的输出结果为 true,是因为 equals 方法内部比较的是两个 int 值是否相等。源码如下:
1.private final int value;
2.
3.public int intValue() {
4.    return value;
5.}
6.public boolean equals(Object obj) {
7.    if (obj instanceof Integer) {
8.        return value == ((Integer)obj).intValue();
9.    }
10.    return false;
11.}
 
虽然 chenmo 和 wanger 的值都是 10,但他们并不相等。换句话说就是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符。
 
四,自动装箱和自动拆箱
既然有了基本类型和包装类型,肯定有些时候要在它们之间进行转换。把基本类型转换成包装类型的过程叫做装箱(boxing)。反之,把包装类型转换成基本类型的过程叫做拆箱(unboxing)。
 
在 Java SE5 之前,开发人员要手动进行装拆箱,比如说:
1.Integer chenmo = new Integer(10);  // 手动装箱
2.int wanger = chenmo.intValue();  // 手动拆箱
 
在 Java SE5 之后,提供了自动装箱与自动拆箱的功能。
1.Integer chenmo  = 10;  // 自动装箱
2.int wanger = chenmo;     // 自动拆箱
 
上面这段代码使用 JAD 反编译后的结果如下所示:
1.Integer chenmo = Integer.valueOf(10);
2.int wanger = chenmo.intValue();
 
所以,自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的。自动装拆箱是一个很好的功能,大大节省了我们开发人员的精力,但也会引发一些麻烦,比如下面这段代码,性能就很差。
1.long t1 = System.currentTimeMillis();
2.Long sum = 0L;
3.for (int i = 0; i < Integer.MAX_VALUE;i++) {
4.    sum += i;
5.}
6.long t2 = System.currentTimeMillis();        
7.System.out.println(t2-t1);
 
sum 由于被声明成了包装类型 Long 而不是基本类型 long,所以 sum += i 进行了大量的拆装箱操作(sum 先拆箱和 i 相加,然后再装箱赋值给 sum),导致这段代码运行完花费的时间足足有 2986 毫秒;如果把 sum 换成基本类型 long,时间就仅有 554 毫秒,完全不是一个等量级了。
------分隔线----------------------------
标签(Tag):
------分隔线----------------------------
推荐内容
  • Javascript教程

    JavaScript 是一种轻量级的解释型 编程 语言。 它旨在用于创建以网络为中心的应用程序...

  • IDEA初始化配置 图解教程

    使用JetBrains IDEA已经两个月了,今天给我自动升级了,但是一直报一个错误(大致就是...

  • java中数组转为列表的几种方法

    java中数组转为集合List,是很基础常见的,日常开发中也经常会用到,今天整理了下,有...

  • java常用设计模式-策略设计模式

    java中常用的设计模式如单例模式、原型模式,这在之前的2篇文章中已经说明,还有代理...

  • Java开发规范

    编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,...

  • java泛型那些事

    泛型的类型安全性 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创...

猜你感兴趣