黑马程序员技术交流社区

标题: Integer有关自动装箱的一些疑问 [打印本页]

作者: blue_sky    时间: 2014-7-11 11:37
标题: Integer有关自动装箱的一些疑问
直接上例子:
  1. Integer i = 1;//这个是自动装箱,创建了一个对象;
  2.                 Integer j = new Integer(1);//这个是创建了一个对象;
  3.                 int z = 1;//定义了一个常量;
  4.                 System.out.println(i==z);//true;由于i值在-128和127之间,所以被重用;
  5.                 System.out.println(j==z);
  6.                 System.out.println(i==j);
复制代码


在这个例子中:
       在对比j==z结果是true;证明它们也是重用了值;为什么i==j判断的值是false呢?
作者: 001可望成功    时间: 2014-7-11 12:39
这个当然是false了,i和z的引用都是存放在栈内存中,而j的引用是存放在堆内存中
作者: blue_sky    时间: 2014-7-11 12:40
查了一些资料发现:
对象判断的时候是提取它的hashCode来进行判断的;而Integer对象的hashCode值就是指向数值;
  1. Integer j = new Integer(1);
  2. System.out.printf(j.hashCode());//值为1;
复制代码

所以,可以说是Integer类型的对象j的hashCode()与int常量1相同。并不能代表对象被重用;


同时,上面发的例子有错误。int i = 1;只是定义了一个int类型的变量;和自动装箱,对象重用无关;
作者: blue_sky    时间: 2014-7-11 12:46
001可望成功 发表于 2014-7-11 12:39
这个当然是false了,i和z的引用都是存放在栈内存中,而j的引用是存放在堆内存中 ...

Integer i = 1;//这个是自动装箱,创建了一个对象;
不是这个自动装箱底层就是执行了
Integer j = new Integer(1);吗?
为什么i的引用存放在了栈内存中了呢?
作者: a6511631    时间: 2014-7-11 13:10
blue_sky 发表于 2014-7-11 12:40
查了一些资料发现:
对象判断的时候是提取它的hashCode来进行判断的;而Integer对象的hashCode值就是指向数 ...

比较赞同这个想法
作者: 刘一博    时间: 2014-7-11 13:54
  1. Integer i = Integer.valueOf(1);
  2.     Integer j = new Integer(1);
  3.     int z = 1;
  4.     System.out.println(i.intValue() == z);
  5.     System.out.println(j.intValue() == z);
  6.     System.out.println(i == j);
复制代码

给你看一下反编译出来的代码,因为i,j都相当于是new出来的对象,所以==比较的时候肯定是不相等的
他们分别和z比较的时候,进行了自动拆箱所以比较返回的是true
作者: 月明星稀    时间: 2014-7-11 14:12
赞同三楼说的
作者: 001可望成功    时间: 2014-7-11 14:52
本帖最后由 001可望成功 于 2014-7-11 16:48 编辑
blue_sky 发表于 2014-7-11 12:46
Integer i = 1;//这个是自动装箱,创建了一个对象;
不是这个自动装箱底层就是执行了
Integer j = new In ...

随后我发一个这方面的帖子吧,栈内存就是存放基本类型和引用类型的变量的,堆内存就是存放new出来的数组或对象的,基本类型的值直接放在栈内存中,不用开辟堆内存空间,而引用数据 类型存放一个堆内存的引用,在你这里,int i = 1;这个1是在栈内存中存放的,Integer i2 = 1;这个1是在常量池中存放的,而new Integer(1)他是在堆内存中存放的,Integer i3存放的是指向这个堆内存的指针。i2和i3这两个对象的引用是不一样的,但当他们都与基本数据类型int i进行“==”时,他们会先拆箱,转为基本数据类型,这样比较的就是值,当然就相等了
作者: blue_sky    时间: 2014-7-11 19:28
001可望成功 发表于 2014-7-11 14:52
随后我发一个这方面的帖子吧,栈内存就是存放基本类型和引用类型的变量的,堆内存就是存放new出来的数组或 ...

谢谢了,现在对JVM加载对象和类时,内存的变化不太清楚。看了你说的,明白了一些。
作者: 亦金亦水    时间: 2014-7-14 14:54
我累个去,搞得都这么仔细,看的我真是一愣一愣的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2