A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© blue_sky 中级黑马   /  2014-7-11 11:37  /  1163 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

直接上例子:
  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呢?

9 个回复

正序浏览
我累个去,搞得都这么仔细,看的我真是一愣一愣的
回复 使用道具 举报
001可望成功 发表于 2014-7-11 14:52
随后我发一个这方面的帖子吧,栈内存就是存放基本类型和引用类型的变量的,堆内存就是存放new出来的数组或 ...

谢谢了,现在对JVM加载对象和类时,内存的变化不太清楚。看了你说的,明白了一些。
回复 使用道具 举报
本帖最后由 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进行“==”时,他们会先拆箱,转为基本数据类型,这样比较的就是值,当然就相等了
回复 使用道具 举报
赞同三楼说的
回复 使用道具 举报
  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
回复 使用道具 举报
blue_sky 发表于 2014-7-11 12:40
查了一些资料发现:
对象判断的时候是提取它的hashCode来进行判断的;而Integer对象的hashCode值就是指向数 ...

比较赞同这个想法
回复 使用道具 举报
001可望成功 发表于 2014-7-11 12:39
这个当然是false了,i和z的引用都是存放在栈内存中,而j的引用是存放在堆内存中 ...

Integer i = 1;//这个是自动装箱,创建了一个对象;
不是这个自动装箱底层就是执行了
Integer j = new Integer(1);吗?
为什么i的引用存放在了栈内存中了呢?
回复 使用道具 举报
查了一些资料发现:
对象判断的时候是提取它的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类型的变量;和自动装箱,对象重用无关;
回复 使用道具 举报
这个当然是false了,i和z的引用都是存放在栈内存中,而j的引用是存放在堆内存中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马