详解Java包装类及自动装箱拆箱

 更新时间:2019年03月25日 09:15:49   转载 作者:Kevin_Lyz  
这篇文章主要介绍了Java包装类及自动装箱拆箱,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java包装类

基本类型 大小 包装器类型
boolean / Boolean
char 16bit Boolean
byte 8bit Byte
short /16bit Short
int 32bit Integer
long 64bit Long
float 32bit Float
double 64bit Double
void / Void

Java 的包装类有两个主要的目的:

  1. Java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向Collections中添加元素(泛型的操作限制加入的只能是对象,比如List = new ArrayList() 的写法是错误的),或者从带对象返回值的方法中返回。
  2. 更加方便类型的转换,如常见的Integer向字符的转换

装箱和拆箱

Java 在SE5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换

如:

Integer i = 10;
int index = i;

装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型装换为基本数据类型

在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。

其他的也类似,比如Double、Character,不相信的朋友可以自己手动尝试一下。

因此可以用一句话总结装箱和拆箱的实现过程:

装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基本数据类型)。

面试问题

下面这段代码的输出结果是什么?

public class Main {
 public static void main(String[] args) {
 Integer i1 = 100;
 Integer i2 = 100;
 Integer i3 = 200;
 Integer i4 = 200;
 
 System.out.println(i1==i2);
 System.out.println(i3==i4);
 }
}

注意 ==和equals的区别:
|类型| == |equals
|–|--|–|
| 基本数据类型 | 值 | 不可用
| 包装类 | 地址 | 内容

输出的结果为:

true
false

为什么会出现这样的结果?输出结果表明 i1 和 i2 指向的是同一个对象,而 i3 和 i4 指向的是不同的对象。此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:

public static Integer valueOf(int i) {
 if(i >= -128 && i <= IntegerCache.high)
  return IntegerCache.cache[i + 128];
 else
  return new Integer(i);
 }

从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在 [-128,127] 之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

上面的代码中 i1 和 i2 的数值为100,因此会直接从cache中取已经存在的对象,所以 i1 和 i2 指向的是同一个对象,而 i3 和 i4 则是分别指向不同的对象。

下面这段代码的输出结果是什么?

public class Main {
 public static void main(String[] args) {
 Double i1 = 100.0;
 Double i2 = 100.0;
 Double i3 = 200.0;
 Double i4 = 200.0;
 
 System.out.println(i1==i2);
 System.out.println(i3==i4);
 }
}

也许有的朋友会认为跟上面一道题目的输出结果相同,但是事实上却不是。实际输出结果为:

false
false

至于具体为什么,读者可以去查看Double类的valueOf的实现。
在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的,Double、Float的valueOf方法的实现是类似的

以上所述是小编给大家介绍的Java包装类及自动装箱拆箱详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java使用JSONObject实例

    java使用JSONObject实例

    JAVA中JSONObject对象的使用方法
    2013-11-11
  • java 学习笔记(入门篇)_多选择结构switch语句

    java 学习笔记(入门篇)_多选择结构switch语句

    在java中为多路分支选择流程专门提供了switch语句,switch语句根据一个表达式的值,选择运行多个操作中的一个,感兴趣的朋友可以了解下
    2013-01-01
  • Kotlin基础教程之数据类型

    Kotlin基础教程之数据类型

    这篇文章主要介绍了Kotlin基础教程之数据类型的相关资料,需要的朋友可以参考下
    2017-05-05
  • JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    本文主要介绍了如何在Eclipse中创建的Maven Project,本文是JavaEE开发的开篇,也是基础。下面内容主要包括了JDK1.8的安装、JavaEE版本的Eclipse的安装、Maven的安装、Tomcat 9.0的配置、Eclipse上的M2Eclipse插件以及STS插件的安装。
    2017-03-03
  • 带着新人看java虚拟机01(推荐)

    带着新人看java虚拟机01(推荐)

    这篇文章主要介绍了java虚拟机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java类变量和成员变量初始化过程的应用介绍

    Java类变量和成员变量初始化过程的应用介绍

    昨天看了一本叫做《突破程序员基本功的16课》的书,个人感觉还可以,主要对Java的技巧进行了一些深入的讲解,让我对类的初始化和对象的创建有了新的认识
    2013-04-04
  • Spring JDBC的使用方法详解

    Spring JDBC的使用方法详解

    这篇文章主要介绍了Spring JDBC的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java 中 System.out.println()和System.out.write()的区别

    java 中 System.out.println()和System.out.write()的区别

    这篇文章主要介绍了 java 中 System.out.println()和System.out.write()的区别.的相关资料,需要的朋友可以参考下
    2017-04-04
  • java 集合----Map、Collection

    java 集合----Map、Collection

    HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap 的 put()方法来添加 key-value 对。HashMap 的 put() 方法.hashCode() 判断返回值相等,如果返回值相等则再通过 equals 比较也返回 true,最终认为key对象是相等的已经在HashMap中存在。
    2016-04-04
  • spring boot整合mybatis利用Mysql实现主键UUID的方法

    spring boot整合mybatis利用Mysql实现主键UUID的方法

    这篇文章主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03

最新评论