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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周洋 黑马帝   /  2012-3-30 15:15  /  2106 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能帮忙分析一下这个函数的结果?代码如下
package execisetest;
public class Zhuangxiang {
        public static void main(String [] args){               
                Integer num3=12;
                Integer num4=12;
                Integer num5=129;
                Integer num6=129;
                int num7=129;
                int num8=129;               
                System.out.println(num3==num4);
                System.out.println(num5==num6);
                System.out.println(num7==num8);        
        }
}
输出结果是

true
false
true
为什么第二个输出结果是false?

9 个回复

倒序浏览
{:soso_e100:}这个结果不难理解。楼主注意:
    整数的自动装箱拆箱的具体过程中,整数在-128到127范围内的时候,java虚拟机不会再为封装成对象的整数进行独自分配地址,
   即多个对象在内存中指向的是同一个地址。这样做有利于内存的节省,因为这些范围内的数字会经常出现。而超过这个范围后就会
   为它们单独分配地址了,题中129>127,所以它们不相等。楼主明白了吧。希望加技术分啊,老师{:soso_e100:}要进黑八,一切顺利,就差技术分了

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 加油!

查看全部评分

回复 使用道具 举报
数字大于byt的范围了  就得重新开辟空间存放数字  小于的话 不重新开辟空间  
回复 使用道具 举报
在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型)。基本类型的数据不是对象,不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法。
所以在java中,针对8种基本数据类型,提供了针对每个基本数据类型的包装类。如下:
INDEX        基本数据类型        包装类
1        int            Integer
2        char          Character
3        float          Float
4        double          Double
5        byte          Byte
6        short          Short
7        long          Long
8        boolean          Boolean
所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如你的例子中把int型包装成Integer类的对象。
所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。
在Java中对于从-128到127之间的数,因为数据比较小,而且使用的比较频繁,他们被装箱为Integer对象后,会在内存中被重用,超过这个值时每次装箱会产生新的对象。因为129超过了被装箱的范围值,所以会产生两个新的对象,既然是两个,所以返回false.
回复 使用道具 举报
本帖最后由 izwj 于 2012-3-30 16:18 编辑

整数在-128到127范围时,java虚拟机不会再为封装成对象的整数进行地址分配,
对象在内存中指向的是同一个地址,“==”的结果就为true;
超过这个范围为它们单独分配地址,129>127,所以“==”的结果就为true;即地址不同
回复 使用道具 举报
-128——127  之内视为 同一个
超过会封装多出个箱子。。
毕老 和张孝详 视频中都提到了。
回复 使用道具 举报
{:soso_e101:}楼上
回复 使用道具 举报
整数类型:int short  long byte

程序中对num3、num4、num5、num6的操作都涉及到了整数装箱成为Interger对象。
对于整数类型装箱成为Integer对象的时候,如果数字在一个字节之内(-128~127),
会先缓存起来,缓存成一个对象。如果数字相同时就直接用这个对象,所以12的时候,
是同一个对象,运算返回true。而两次的129赋值,创建了新对象,=运算就返回false。

回复 使用道具 举报
胡川 中级黑马 2012-3-30 18:06:12
9#
整数在-128到127范围,
而129>127,所以“==”的结果就为false;即地址不同
懂了吧
回复 使用道具 举报
享元模式:
      -128到127中的数字由于太常被用到,所以在内存中有个池,这些对象常驻内存。需要的时候直接指向他,避免多次创建的内存消耗。
      129过了,内存池中没有这个对象,创建了2个对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马