黑马程序员技术交流社区

标题: 帮忙分析一下这个函数的结果? [打印本页]

作者: 周洋    时间: 2012-3-30 15:15
标题: 帮忙分析一下这个函数的结果?
谁能帮忙分析一下这个函数的结果?代码如下
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?


作者: 肖发腾    时间: 2012-3-30 15:57
{:soso_e100:}这个结果不难理解。楼主注意:
    整数的自动装箱拆箱的具体过程中,整数在-128到127范围内的时候,java虚拟机不会再为封装成对象的整数进行独自分配地址,
   即多个对象在内存中指向的是同一个地址。这样做有利于内存的节省,因为这些范围内的数字会经常出现。而超过这个范围后就会
   为它们单独分配地址了,题中129>127,所以它们不相等。楼主明白了吧。希望加技术分啊,老师{:soso_e100:}要进黑八,一切顺利,就差技术分了
作者: 贠(yun)靖    时间: 2012-3-30 16:10
数字大于byt的范围了  就得重新开辟空间存放数字  小于的话 不重新开辟空间  
作者: 王运科    时间: 2012-3-30 16:16
在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:17
本帖最后由 izwj 于 2012-3-30 16:18 编辑

整数在-128到127范围时,java虚拟机不会再为封装成对象的整数进行地址分配,
对象在内存中指向的是同一个地址,“==”的结果就为true;
超过这个范围为它们单独分配地址,129>127,所以“==”的结果就为true;即地址不同

作者: 翟友伟    时间: 2012-3-30 16:21
-128——127  之内视为 同一个
超过会封装多出个箱子。。
毕老 和张孝详 视频中都提到了。
作者: 邵中国    时间: 2012-3-30 16:23
{:soso_e101:}楼上
作者: newlaw2013    时间: 2012-3-30 17:51
整数类型:int short  long byte

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


作者: 胡川    时间: 2012-3-30 18:06
整数在-128到127范围,
而129>127,所以“==”的结果就为false;即地址不同
懂了吧
作者: 李井山    时间: 2012-3-30 18:48
享元模式:
      -128到127中的数字由于太常被用到,所以在内存中有个池,这些对象常驻内存。需要的时候直接指向他,避免多次创建的内存消耗。
      129过了,内存池中没有这个对象,创建了2个对象。




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