动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

Java中的拆箱和装箱

05-11 16:52 706浏览
举报 T字号
  • 大字
  • 中字
  • 小字

我们先来了解装箱和拆箱的基本概念:

装箱就是自动将基本数据类型转换为包装器类型;使用Integer.valueOf方法。

拆箱就是自动将包装器类型转换为基本数据类型;使用Integer.intValue方法。

举个例子:

Integer total = 99; 
//执行上面那句代码的时候,系统为我们执行了,即自动装箱
Integer total = Integer.valueOf(99);int totalprim = total; 
//执行上面那句代码的时候,系统为我们执行了,即自动拆箱
int totalprim = total.intValue();

我们可以从下面的两个问题来理解拆箱和装箱。

1.范围问题

 如下题目:   

Integer i = 400; 
Integer j = 400; 
System.out.println(i==j);  //false
Integer o = 12; 
Integer k = 12;
System.out.println(o==12);  //true

上面提到,使用 Integer去创建数据,其实是一个Integer.valueOf 过程,Integer.valueOf 源码如下:   

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

分析:如果值的范围在-128到127之间,它就从高速缓存返回实例。否则 new 一个Integer对象。new Integer 就是一个装箱的过程了,装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。
所以说最后是i 和 j 两个对象比较,内存地址不一样,结果就是false了。

2.==的值比较问题

例子如下:

int a =200;
Integer b = new Integer(200);
Integer c = 200;
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(b==c); //false

分析: a==b,a==c,只要和基本数据类型(即 int)比较,Integer就会调用value.intValue()拆箱成基本数据类型,你也可以理解为:当有基本数据类型,只比较值b==c,这两个是永远不会相等的,拆箱装箱只是针对基本数据类型的比较才有,Integer并不是基本数据类型,b、c两者存放的内存地址不一样,所以不相等。

我们很容易得出以下结论:

(1)无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。

(2)两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。

(3)两个都是new出来的,即两个new Integer比较,则为false。

(4)int与Integer、new Integer()进行==比较时,结果永远为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。

讲了这么多,其实我只是Java的搬运工,这些知识点都是从动力节点在线的视频课程中搬运过来的,想要学习更多的Java知识,可以观看动力节点在线的视频课程,开启你的全新Java学习之旅吧!

0人推荐
共同学习,写下你的评论
0条评论
杨晶珍
程序员杨晶珍

98篇文章贡献357785字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消