刚打开CSDN,一个好友发了一个短信给我,问了一个问题://Integer类下面的equals方法,如果这么用,会出现编译错误么?new Integer(10).equals(10);
我觉得没啥问题嘛,因为一个Integer对象和另一个被boxing的int值比较,没有问题。但是我后来在Eclipse下面敲了一下代码:System.out.println(new Integer(10).equals(new Integer(10)));//最原始的用法,没问题;
System.out.println(new Integer(10).equals(10));//equals里面的10被编译器auto-boxing成Integer对象,也没有问题;
System.out.println(new Integer(130).equals(11111));//为什么这个没有编译问题呢?11111已经超过了auto-boxing的范围了然后查看Eclipse下面对于Integer类的equals方法的解释:
Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
也都提到了两边要是同等的对象才能比较啊?难道是我脑子短路了么?

解决方案 »

  1.   

    auto-boxing跟常量池缓存没关系吧 只要是int范围内的整数都会自动装箱拆箱 不是一定要在-128-127之间啊 
      

  2.   

    奇怪了, 10 或者任何合法的整数,在与Integer进行操作时,都会被自动转换的!
    我看你太较真了!
      

  3.   

    equals 比较的是两个对象是否相等包括内存地址。System.out.println(new Integer(130).equals(11111));//这条语句,应该打印出false ,因为  new Integer(130)  与 new Integer(11111)//自动转换,是两个对象,值与对象的内存地址也不会相同而已.
      

  4.   

    int的值在-127到128之间才被缓存的 
      

  5.   

    确实是只有-127-128被缓存 但是自动装箱并不是只对有缓存的integer对象才进行啊 没被缓存的一样自动装箱 只不过没从缓存池里拿  新new了一个Integer而已
      

  6.   

    当对byte, boolean,int(-127 - +128), short(-127 - +128), char(\u0000 - \u007f)在封箱时是必须进行缓存的,而对其它值,也是被允许进行缓存。
      

  7.   

    如果Integer只能包装-127 - +128的数据 那也太没用了只是在缓存范围内可以通过偏移量直接指向,而在缓存范围外要新建一个int
      

  8.   

    java的autoboxing 和 auto-unboxing
    http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx论坛某人写的,解释得很清楚
      

  9.   

    The result is true...相等才返回真,不是不能比较啊.
      

  10.   

    这是jdk里Integer的源码 大家好好看看
        private final int value;    public Integer(int value) {
    this.value = value;
        }    public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
      

  11.   

    如果是-128到127 用内存里现成的对象
    如果不在这个范围 new Integer()
      

  12.   

    Integer对象的缓存用作是在auto-boxing的时候提高性能和节省内存空间,并不是说不在-128~127就不会执行auto-boxing了。
      

  13.   

    大家说得很清楚了,在-128~127在缓存中取数据进行auto-boxing,超过这个范围会重新new 个对象进行auto-boxing
      

  14.   

    怎么能说比较的包括内存地址呢???这是不正确的,某楼上已经把Integer的源码贴出来了,他只是比较是否同一类型的两对象的属性值是否相等。
    而==才是比较是否完全一致,包括内存地址和属性值