public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
上面是java原码,integer的equals方法,请 看 我写的demo
                Integer i51 = 250;
                Integer i61 = 250;
System.out.println(i51 == i61);
System.out.println(i51.equals(250)); //true
System.out.println(i51.equals(i61)); //true
为什么equals250 是true啊,代入原码中 ,先判断 obj instanceof Integer ,这个250是obj?是不是任意一个整型数字,注意是整型数字,例如1,2,3....都是Integer的实例呀?
((Integer)obj).intValue()  ,这前面的(Integer),代表强制转换吗?也就是说 底层是 (Integer)250.intValue()?这句着实不懂呀,有没高手能详解下,越详细越好,谢谢了!

解决方案 »

  1.   

    java的自动装箱功能,当你输入int 类型的250时!会默认进行数据类型转换 将int类型的250提升为Integer类型
      

  2.   

    为什么equals250 是true啊?  弄明白“==”和equals的区别就知道为什么了,equals就是比较两个数值是不是相等的。“==”不仅比较数值,还要比较内存中对应的地址
    例如1,2,3....都是Integer的实例呀?  默认的是int类型
    ((Integer)obj).intValue();  把obj强制转换成Integer类型,然后获取int数值,就是250,这个250仅仅是一个int类型的数值250,
    所以这里return value == ((Integer)obj).intValue();比较的就是简单的数学上的250==250;不是Integer对象的比较
      

  3.   


    我知道equals和==的区别,我比较不明白的是那句话:if (obj instanceof Integer)  
    第一我想问的是  250就是obj?换而言之,是不是 我在任意数字,不用定义变量 ,也就是obj?1就是obj?
    instanceof的意思,不是比较等号左边是不是右边的实例吗?也就是说 250 instanecof Integer 是true,换而言之,任意整型的数字带入这里都是Integer的实例?
     i5 instanceof Integer,这个我能理解,我不能理解的就是,明明我全文没有定义这个250,为什么一个常量就可以是Integer的实例?求大神继续深入一下,谢谢
      

  4.   

    Java 中类型分两类: 基本类型(short int ,float ,double, byte , char,boolean ,long ) 引用类型(与基本类型对应的引用类型Short , Integer,Float,Double,ByteCharacter,Long). 
     从5.0 开始引用了自动打包.     即 Integer i51 = 250   等价于 Integer i50=new Integer(250)  :250  是一个int类量的字面量,自动打包成了一个Integer 实例。还有查了下api 已不建议使用此构造函数(Deprecated. It is rarely appropriate to use this constructor. The static factory valueOf(int) is generally a better choice, as it is likely to yield significantly better space and time performance.  )
      

  5.   

    看看Integer底层源码,自动缓存-128到127
    除了Double Float不缓存外 其余都有缓存