zoukankan      html  css  js  c++  java
  • Integer 值比较 equal 与 ==

    Integer 值比较 equal 与 ==

    引言

    这两天写 CRUD 的逻辑时,碰到个问题。枚举值里的 Integer 和另一个 Integer ,使用==进行值比较时,明明值一样,返回的却一直是 false,使用equals()返回才是 true。
    之前用==equal()时,返回结果在预期内,就没有留意。虽然知道前者肯定变成比较地址了,但是这方面的知识我想不起来了,翻了翻了基础知识,加深下印象。知道的就没必要读下去了。Integer 之间的比较用 equal ,最好别用 ==

    一些比较

    public static void main(String[] args) {
                int test = 3;
                Integer intA = new Integer(3);
                Integer intB = new Integer(3);
                Integer intC = 2 + 1;
                Integer intD = 52 -49;
                Integer intE = 3;
                Integer intF = test;
                Integer intG = 128;
                Integer intH = 128;
    
                System.out.println(intA == intB); // false
                System.out.println(intA == intC); // false
                System.out.println(intC == intB); // false
                System.out.println(intG == intH); // false
                System.out.println(intC == intD); // true
                System.out.println(intC == intE); // true
                System.out.println(intD == intE); // true
                System.out.println(intD == intF); // true
    }
    

    Integer 内部有一个静态变量池 IntegerCache,存放了一个数组Integer[],-128 ~ 127。普通的两个值运算都会进行自动拆箱,再进行自动装箱,自动装箱使用的是 valueOf 方法。Integer.valueOf 方法在实现时如果不超过范围(-128 ~ 127)则从 IntegerCache 中获取缓存的Integer对象。 如果超过范围则是 new 一个新Integer对象。
    所以 new Integer,比较,false;赋值不在(-128 ~ 127)区间,比较,false。
    所以,Integer 之间的比较用 equal ,最好别用 ==

    一些源码

    Integer

    Integer 的自动拆装箱:

    	Interge i=100// 实际代码为
    	Interge i=Integer.valueOf(100);
    

    而 Integer 的 valueof():

    public static Integer valueOf(int i) {
    	if (i >= IntegerCache.low && i <= IntegerCache.high)
    		return IntegerCache.cache[i + (-IntegerCache.low)];
    	return new Integer(i);
    }
    

    IntegerCahce

    此处可以看见,在一定范围内,返回值为 IntegerCahce 内的缓存,最后以下 Integer 的内部类 IntegerCahce,如下:

    private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
    
            static {
                // high value may be configured by property
                int h = 127;
                String integerCacheHighPropValue =
                    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                if (integerCacheHighPropValue != null) {
                    try {
                        int i = parseInt(integerCacheHighPropValue);
                        i = Math.max(i, 127);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    } catch( NumberFormatException nfe) {
                        // If the property cannot be parsed into an int, ignore it.
                    }
                }
                high = h;
    
                cache = new Integer[(high - low) + 1];
                int j = low;
                for(int k = 0; k < cache.length; k++)
                    cache[k] = new Integer(j++);
    
                // range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
            }
    
            private IntegerCache() {}
        }
    

    代码中可见,Integer把-128到127(可通过JVM参数配置进行调整,增大范围)的整数都提前实例化了。所以不管创建多少个这个范围内的 Integer 用 valueOf 出来的都是同一个对象。此举是为了尽可能的减少 new() 带来的开销。
    在 Long 和 Short 的源码中,也做了同样的优化。

    参考

    1. JAVA基础整理——IntegerCache — 豆豆323
    2. 为什么Integer比较要用equals — 从09年开始
  • 相关阅读:
    nodejs微服务健康检查方案
    RabbitMQ inequivalent arg 'durable' for exchange 'csExchange' in vhost '/': received
    python 虚拟环境
    gulp-babel使用
    node-schedule定时任务
    微信小程序分包(附微信小程序开发学习手册)
    抖音、腾讯、京东、阿里等大厂性能优化方案总结(含项目实战分析及视频)
    微信小程序绘制二维码(附微信小程序开发学习手册)
    【纯干货分享】拒绝卡顿,揭秘盒马鲜生 APP Android 短视频秒播优化方案
    碰壁五次!我闭关28天啃完这些书,再战拿下腾讯,爱奇艺,小红书,快手等10家大厂!化身offer收割机!
  • 原文地址:https://www.cnblogs.com/Sherlock-J/p/12925923.html
Copyright © 2011-2022 走看看