黑马程序员技术交流社区

标题: 有些东西,似懂非懂就要大胆的问出来 [打印本页]

作者: 沈文杰    时间: 2013-3-16 09:37
标题: 有些东西,似懂非懂就要大胆的问出来
本帖最后由 沈文杰 于 2013-3-16 20:18 编辑

以前我一直认为这个题目我懂了但是现在好像又没懂
  1. public class Question01 {
  2.         public static void main(String[] args){
  3.         int a = 1;
  4.         int b = 1;
  5.         
  6.         Integer i1 = 1;//Integer i1 = (Integer)1,自动装箱
  7.         Integer i2 = 1;
  8.         
  9.         Integer i3 = new Integer(1);
  10.         Integer i4 = new Integer(1);
  11.         
  12.         System.out.println(a==b);//true
  13.         System.out.println(a==i1);//true
  14.         System.out.println(a==i3);//true
  15.         System.out.println(a==i4);//true
  16.         System.out.println(i1==i2);//true
  17.         System.out.println(i3==i4);//false
  18.                
  19.         }
  20. }
复制代码
前几天版主出过这个题目,答案也发下来了,看过觉得不是太明白,求一下这段代码的堆栈分配图解。



作者: 沈文杰    时间: 2013-3-16 10:01
自己顶一下,我相信也有很多人是似懂非懂的,求答案
作者: itserious    时间: 2013-3-16 15:47
file://C:\Users\serAdmin\Desktop\abc.gif
作者: itserious    时间: 2013-3-16 16:17
你要先明白基本数据类型比较的是值。而引用类型(对象)比较的是地址。
注意:如果一个Integer的值在一个byte的泛围内,即-127~128,那么会将它当作一个int 类型来看待。超出那个泛围才把它当作一个对象来看待。
int a1=127;
int a2=127;
int b=128;
Integer c=127;// 等价int c=127
Integer d=128;// 等价 new Integer(128);
Integer e=new Integer(127);//e 为对象
integer f=new Integer(127);//f为对象
有以下情况:
a1==a1;a1!=b;//基本数据类型比较值
a1==c; b!=d;//c在-127~128泛围内,d没有。
e!=f;  //e和f为两个不同的对象
c!=e; c!=f//c,e,f是不同的对象,它们的地址值不同

abc.gif (41.41 KB, 下载次数: 59)

abc.gif

作者: 123    时间: 2013-3-16 17:05
这个是常量池的问题:a,b,i1,i2在编译时期就能确定,而他们的值又相同,所以他们指向同一个存储区。而i3和i4在编译时期不能确定,是在运行时创建出来的,它们被保存在运行时内存区,i3和i4都是new出来的,i3和i4都是引用类型数据,所以i3和i4通过==比较不相等,a和i3通过==比较,是数值类型之间的比较,值相等,所以返回true,同理a和i4比较也是一样的。
希望我的回答对你有帮助。
作者: 沈文杰    时间: 2013-3-16 18:23
itserious 发表于 2013-3-16 16:17
你要先明白基本数据类型比较的是值。而引用类型(对象)比较的是地址。
注意:如果一个Integer的值在一个by ...

那基本数据类型与对象用==比较呢?
a==i3这句话为什么返回true?
作者: 沈文杰    时间: 2013-3-16 18:25
wwd867551927 发表于 2013-3-16 17:05
这个是常量池的问题:a,b,i1,i2在编译时期就能确定,而他们的值又相同,所以他们指向同一个存储区。而i3和i ...

基本数据类型a与对象i3比较时也是比较值?是什么原理?

作者: 沈文杰    时间: 2013-3-16 18:32
感谢楼上几位的解答,自我理解
当int型数值在127到-128之间时,int a,int b ;Integer i1;Integer i2;都等价于int a = 1;都指向了栈内存中的1
而Integer i3;Integer i4都是对象指向堆内存中的两个不同对象,唯一不理解的地方就是
那基本数据类型与对象用==比较呢?
a==i3这句话为什么返回true?
希望得到更详细的解答,谢谢
作者: itserious    时间: 2013-3-16 19:37
沈文杰 发表于 2013-3-16 18:23
那基本数据类型与对象用==比较呢?
a==i3这句话为什么返回true?

这样给你说吧:如果有对象Integer参与的话,你就看这个对象的值在没有在-127~128之间就行了,
如果在,那么就不管它是不是对象了,就把它直接看作是int类型的,所以比较的是值,
如果不在那个泛围内,就把它看作一个对象,它和别人比较的是地址值。
作者: 123    时间: 2013-3-16 19:43
沈文杰 发表于 2013-3-16 18:25
基本数据类型a与对象i3比较时也是比较值?是什么原理?

自动拆箱

作者: 沈文杰    时间: 2013-3-16 19:51
wwd867551927 发表于 2013-3-16 19:43
自动拆箱

哦,谢谢。
作者: 沈文杰    时间: 2013-3-16 20:14
itserious 发表于 2013-3-16 19:37
这样给你说吧:如果有对象Integer参与的话,你就看这个对象的值在没有在-127~128之间就行了,
如果在,那 ...

感谢哥们的回答很热情,很认真还发了我要的图。我发现你两次说一个字节范围好像都说的是-127-128应该是记错了吧,希望你注意这一点哦,一个字节在计算机中是使用补码进行存储的,范围是-128-127

-128-127.jpg (115.1 KB, 下载次数: 55)

-128-127.jpg

作者: itserious    时间: 2013-3-16 21:47
沈文杰 发表于 2013-3-16 20:14
感谢哥们的回答很热情,很认真还发了我要的图。我发现你两次说一个字节范围好像都说的是-127-128,应该是 ...

呵呵,确实是记错了,谢谢提醒:)




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