• Integer用==比较时127相等128不相等的原因


    1    for (int i = 0; i < 150; i++) {
    2                 Integer a = i;
    3                 Integer b = i;
    4                 System.out.println(i + " " + (a == b));
    5             }部分结果

    结果为:

    复制代码
    .....
    124 true 125 true 126 true 127 true 128 false 129 false 130 false 131 false
    复制代码

    黑人问号?  为什么到128就不行了? 问题在哪里?  (道行太浅!  为什么就认为 false是异端)

    查了一下java会自动将(i)int类型转换为Integer类型,即

     1 Integer a = Integer.valueOf(1); 

    等等,  再仔细思考一下。  结合上述例子,每一次 i和j都会被装箱为Integer   既然是对象,那就不应该返回true了啊?。  那我就用看看 i和j的内存地址()

    for(int i=0;i<150;i++){
        Integer a=i;
        Integer b=i;
        System.out.println(a+" "+b+" "+System.identityHashCode(a)+" "+System.identityHashCode(b));
    }

    部分结果:

    复制代码

    1 123 123 1531448569 1531448569 2 124 124 1867083167 1867083167 3 125 125 1915910607 1915910607 4 126 126 284720968 284720968 5 127 127 189568618 189568618 6 128 128 793589513 1313922862 7 129 129 495053715 1922154895
    复制代码

    竟然....... 竟然从0到127不同时候自动装箱得到的是同一个对象!从128开始才是正常情况。  那看看源码

    复制代码
        /**
         * Returns an {@code Integer} instance representing the specified
         * {@code int} value.  If a new {@code Integer} instance is not
         * required, this method should generally be used in preference to
         * the constructor {@link #Integer(int)}, as this method is likely
         * to yield significantly better space and time performance by
         * caching frequently requested values.
         *
         * This method will always cache values in the range -128 to 127,
         * inclusive, and may cache other values outside of this range.
         *
         * @param  i an {@code int} value.
         * @return an {@code Integer} instance representing {@code i}.
         * @since  1.5
         */
        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
    复制代码

    我大概的翻译一下啊,  数再-128到127之间,就直接在缓存里取。否则就返回一个新对象。  哦哦这下问题解决了

    转自:https://www.cnblogs.com/smellpawn/p/10825199.html

  • 相关阅读:
    asp.net C# 实现阿里大鱼和云片网短信接口类
    asp.net C# 实现微信接口权限开发类
    asp.net C# 实现微信服务器配置
    php学习资料
    阿里云ECS升级OpenSSL记录
    Docker(十三):OpenStack部署Docker集群
    Docker(十二):Docker集群管理之Compose
    Docker(十一):Docker实战部署HTTPS的Tomcat站点
    Docker(十):Docker安全
    Docker(九):Docker容器卷插件
  • 原文地址:https://www.cnblogs.com/bcl88/p/12393821.html
Copyright © 2020-2023  润新知