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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class IntegerDemo
{
        public static void main(String[] args)
        {
               
                Integer m = 128;
                Integer n = 128;
        System.out.println(m==n);

                Integer a = 127;
                Integer b = 127;
      System.out.println(a==b);
       
        }
}
为什么这个语句 System.out.println(m==n);输出的是false
而这个语句  System.out.println(a==b);输出的是true
视频中说是:127在byte数据类型范围中,但是byte类型的不是自动转换为int的吗?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
       不是的啊!张老师的视频里不是说了吗,对于基本数据类型的整数,要将其自动装箱为Integer对象时,如果这个数字在一个字节之内,即 -128~127之间,则将其包装为一个Integer对象,并缓存起来,将其缓存到一个词里面,当下次再要将基本数据数据类型装载为Integer对象时,先查词字里有没有改数字,如果有取其数值直接使用,
       m=n=128不在该词字内,所以在自动装箱时,转换为Integer对象时,不见得对象m,n的值就一定是128,因为Integer()方法接收的参数可以是String型,128可能是由某个字符串转化为Integer时产生的,也可能就是一个整型的的整数,在自动装箱时,不确定其类型,所以自动装箱后赋值给引用变量m,n,他们不见得就相等,所以返回false
       而 a=b=127,在词字内,当将其自动装箱时,就会查词,用127这个整型数值直接代替,并赋值给引用变量a,b,所以a,b的值一定相等,返回true

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你可以查看java系统中的java.lang.Integer类的源代码会发现:
static final Integer[] cache=new Integer[-(-128)+127+1];
static {
            //执行初始化,创建-128到127的Integer实例,并放入cache数组中
       for(int i = 0;i<cache.length;i++)
           cache[i]=new Integer (i-128);
}
系统会把一个-128到127之间的整数自动装箱成Integer实例,并放入cache数组中缓存起来,以后把-128到127之间的整数自动装箱成Integer实例时,永远都将引用cache数组的同一个数组元素,所以他们相等;但每次把一个不在-128到127之间的整数自动装箱成Integer实例时,系统会重新创建一个Integer实例,,所以不相等的,String类也是类似的,String类也会对通过直接量直接复制的String实例进行缓存。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
介于-128~127之间的short和int值,会被打包到固定的对象中。注意,是固定的,也就是说堆内存中只有一个对应的包装类对象。
Integer i1=123;
Integer i2=123;
楼主的例子中,当i1被打包成123以后,堆内存中就存在了123这个Integer对象。
当下一次创建新的Integer对象时,如果是值是123,就不会再开辟新的内存空间了,只会让i2这个变量引用已产生的对象。
也就是说,此时i1和i2的指向是一样的。所以比较起来结果为true。

当值范围不在-128~127范围内时,情况就不同了。Jvm会为新创建的Integer分配新的空间。
因此,i3和i4的指向就不同了,他们分别指向各自的Integer对象,因此比较结果为false

希望这么讲你能明白。

多看看别的同学提出的问题,这个问题已经提出来不下五遍了,在论坛里要多多相互学习啊

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
还真是啊。。。剧然会出来两个不同的结果。。
Integer a = 127;
Integer b = 127;

Integer a = new Integer(127);
Integer b = new Integer(127);
按理说应该是相同的啊。。。可是输出的结果却不一样。。求高人吧。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马