目录

1.自动装箱,自动拆箱


1.自动装箱,自动拆箱

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

java的数据类型:

自动装箱:

最主要的就是Integer b=a;这行代码执行了什么?其实这就是自动装箱的过程,上面程序在执行Integer b=a;的时候调用了Integer.valueOf ( int i ) 方法,`Integer b=a; 这段代码等同于:Integer b=Integer.valueOf ( a ) 。

自动拆箱:

其实 int a=b,这段代码等价于:int a=b.intValue(),来看看inValue()方法到底是什么,下面是源码:、

看看相关的题目:

代码1好理解,a和b指向的是堆的两块不同的区域,所以他们是不相等的,输出fasle。

代码2也好理解,他是一个自动装箱的过程,会调用Integer.valueOf ( int i ) 方法,所以,他们c,d都不会创建新的对象,而是直接从常量池中拿。所以他们都是一样的,输出true.

代码3也是哥自动装箱的过程,调用Integer.valueOf ( int i )方法,判断不在缓存中拿,所以会在堆上创建新的对象,比较的时候当然是fasle.

代码4,int g=59,首先明白这个59是存储在哪里的?由于他是基本的数据类型,所以它是存在栈中的,Integer h=new Integer(59);这个会在堆中就创建一个对象存储的是59,但是由于代码执行到g==h的时候,这时一个是基本类型一个包装类型,他们相比较,h会发生自动拆箱的过程。即调用intValue()方法返回一个int类型,基本类型就是只比较数值,所以输出true。

接下来再看:

这个输出会是什么?

public class Test4 {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);}
}

其实只要看看Double的valueOf()方法的实现就知道了:

所以他会输出false,false

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

   Double、Float的valueOf方法的实现是类似的。

好,接下来再看一个题目:这个输出会是什么?

首先第一个没有什么疑问,c和d都来自缓存,所以相等输出true.

第二个e,f的输出也没什么疑问,都会创建新的对象,所以不等,输出false.

第三个可能刚刚看的时候有点懵逼,但是仔细想想就知道答案,首先会执行的是a+b,首先a和b是包装类型,是对象,他们是不可能相加的,所以先要执行拆箱的操作将a,b拆成基本数据类型再做相加的操作,完了之后与c进行比较,c是包装类型,所以c也会自动拆箱进行比较,这儿可能有疑问就是为什么不是自动装箱成包装类型去比较,而是包装类型进行了拆箱操作呢?

看这个例子:

如果最后是装箱操作的话,输出的就是false,所以最后他不是装箱而是拆箱操作。

所以最后输出true.

第四个的其实就是equals()方法和==的区别,equals()和==其实一样,判断的是两个对象是否相等,但是Integer对equals()方法进行了重写,他比较的就是值,他不会进行类型转换。所以执行a+b的时候依然会有一个拆箱的过程,但是指向equals的时候她会有一个装箱的过程。所以输出的是true.

第五个和第三个有点类似,都是转化为基本的数据类型,然后比较数值,所以他们数值是相等的,返回的是true.

第六个也是先拆箱,然后相加运算,但是请注意这个和上一个直接==不同,上面可以拆箱比较数值,而这个equals()方法里面是Object类型的数据,也就是说他要传一个引用类型的参数,所以a+b会装箱成Integerr类型的数据,但是g是Long类型。类型不同就比较不了了。

第七个,对于a+h,先自动触发拆箱,就变成了int类型和long类型相加,这个会触发类型晋升,结果是long类型的,然后会触发装箱过程,就变成Long了。因此比较结果是true。

在项目中,当我们使用对象的比较的时候一般会用到Objects类,

常用方法:

1.public static boolean equals(Object a,Object b):比较对象a和对象b是否相等.
  *比较2个对象是否相等,底层依赖对象重写的equals的方法,如果没有重写,则使用Object的equals()

2.public static <T> T requireNonNull(T obj):检查对象obj不为null,如果为null,则抛出空指针异常,否则返回obj本身.
  *可以判断对象是否是空对象.限制参数不能为空.

3.public static boolean nonNull(Object obj):判断对象是否为null,不为返回true,否则返回false

4.public static boolean isNull(Object obj):和nonNull()相反.

参考博客:

https://www.cnblogs.com/dolphin0520/p/3780005.html

https://blog.csdn.net/u013309870/article/details/70229983

https://blog.csdn.net/ijwddd/article/details/80557759

java基础--06(自动装箱拆箱)相关推荐

  1. Java 128陷阱+自动装箱拆箱

    1.大纲概述 Int 整型为java八大基础类型之一,Integer是它的包装器类型:int的默认值为0,而Integer的默认值为null. 128陷阱:指 Integer类封装的数字在[-128, ...

  2. java中为什么自动装箱拆箱_Java自动装箱和自动拆箱的理解

    Java自动装箱和自动拆箱的理解 1.代码 public class AutoBoxing { public static void main(String[] args) { Integer a = ...

  3. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  4. Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

    1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...

  5. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  6. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  7. java自动装箱拆箱原理

    java自动装箱拆箱原理 看了很多博主都没写原理,只是浅显地说了自动装箱拆箱的含义,我就把这个必须知道的知识写一下吧 1.自动装箱 以int -> Integer为例,Integer integ ...

  8. Java 8 自动装箱拆箱效率影响测试

    Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论:   1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒   2. 拆箱发生 232−12^{32-1}23 ...

  9. java自动装箱拆箱深入剖析

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:  java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装 ...

  10. Java自动装箱/拆箱

    自动装箱和自动拆箱 那么Java中有八大基本数据类型,byte.char.short.int.long.double.float.boolean.而它们有对应的包装类 Byte.Character.S ...

最新文章

  1. 让AI有道德!用AI的方式去发展AI
  2. 诺贝尔物理学奖首次颁向黑洞!霍金好友加冕,第四位女性获奖者诞生
  3. python使用方法-python-tkinter使用方法——转载(一)
  4. ThumbnailUtils的使用
  5. Python3.5 Day1作业:实现用户密码登录,输错三次锁定。
  6. mysql ab复制_实现mysql的ab复制(a-b-b,a-b-c)
  7. php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK)
  8. POJ 2135 Farm Tour (费用流)
  9. 【POJ - 2594】Treasure Exploration(floyd传递闭包 + 最小路径覆盖,图论)
  10. Spring Boot freemarker导出word下载
  11. 截取屏幕并保存为BMP文件
  12. Matter-JS Bodies 内置刚体模块
  13. 用HackRF One模拟GPS信号
  14. unity商店的Standard Assets自带人物移动插件的bug修改
  15. safari java插件故障_Safari Flash插件故障怎么办-Safari Flash插件故障解决方法 - 河东软件园...
  16. pytest web自动化 从百草园到三味书屋....
  17. ZZNUOJ_C语言1039:n个数求和(完整代码)
  18. Symbian OS C++程序员编码诀窍
  19. 互联网巨头:必须要裁员吗?
  20. c# excel导入后处理不固定列数据

热门文章

  1. 论文检索及主要获取途径
  2. 使用Compose实现自定义摩天轮的效果
  3. element表格自定义排序
  4. NOIP 2018 摆渡车
  5. 激进还是放缓?明凌晨美联储公布新一轮加息路径
  6. (五)Ps裁剪/切片
  7. 创建swap分区时 swapon: /swapfile:读交换区头失败
  8. L1-067 洛希极限(Python3)
  9. fastAdmin模板中的{:__(‘abc‘)}表示的是什么意思
  10. php 切图,ps怎么切图