1.简介
最近在牛客网上看到这样一道面试题
Integer i01 = 59;
int i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);
System.out.println(i01 == i02);
System.out.println(i01 == i03);
System.out.println(i01 == i04);
System.out.println(i02 == i03);
System.out.println(i02 == i04);
System.out.println(i03 == i04);
要我立刻选出结果,结果本人在这个地方犯了一个错误:就是基本数据类型和包装类型的比较,到底是比较的是值还是地址引用,
2.解题思路(本人的思路)
1.包装类型之间的比较就是比较的内存地址
,基本数据类型之间的比较就是比较的值
2.由于当前的数据new出现的是一个新的对象
所以i04绝对是一个新的内存地址
3.使用Integer.valueOf()产生的对象实际上与前面的一致,由于当前的值是在-128到+127之间的值,所以值都是同一个
System.out.println(i01 == i02);为true
System.out.println(i01 == i03);为true
System.out.println(i01 == i04);为false
System.out.println(i02 == i03);//如果比较的是值那么就为true
System.out.println(i02 == i04);//如果比较的是值那么就为true
System.out.println(i03 == i04);对象之间的比较为内存地址的比较,结果应该为false
这个,本人判断到这个地方就开始迷糊了,到底基本数据类型和包装类型的比较,到底是比较的是值还是地址引用?
3.使用当前的反编译工具查看(个人觉得出现这个问题可能是编译器做了手脚)
通过这个反编译工具发现当前的,所有将Integer o=基本数据
的时候默认会调用Integer.valueOf(基本数据类型)
最重要的发现是基本数据类型与包装类型之间的==
比较包装类型,默认会转换为基本数据类型比较
,所以基本数据类型与包装类型的比较实际就是基本类型的比较,只会比较两者之间的值
4.查看equals比较
System.out.println(i03.equals(i01));
System.out.println(i04.equals(i02));
System.out.println(i04.equals(i03));
实际上的比较
发现比较的还是值,equals实际上就是就是两个对象之间的值的比较
5.总结
1.通过查看编译后的代码方式,基本上基本数据类型和包装类型的比较的时候起始就是比较两者之间的值,包装类型默认会获取.intValue()使用基本类型进行比较
2.包装类型之间的比较实际上就是比较内存地址,所以使用equals比较两个对象,基本数据类型没有equals方法,equals是object的方法,所以equlas比较基本数据类型的时候会将基本数据类型变成包装类型进行比较
3.所以小心==
比较基本数据类型和包装数据类型
以上纯属个人见解,如有问题请联系本人