Java 自动装箱类型(Autoboxing) 之间的比较

参考

how-to-properly-compare-two-integers-in-java

示例

    public static void main(String[] args) {
        // (1)
        Integer integer1 = 1;
        Integer integer2 = 1;
        // true
        System.out.println(integer1 == integer2);

        // (2)
        integer1 = 256;
        integer2 = 256;
        // !!!false
        //  If the value p being boxed is an integer literal of type int
        // between -128 and 127 inclusive (§3.10.1),
        // or the boolean literal true or false (§3.10.3),
        // or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4),
        // then let a and b be the results of any two boxing conversions of p.
        // It is always the case that a == b.
        System.out.println(integer1 == integer2);

        // (3)
        // true
        System.out.println(integer1 == 256);

        // (4)
        integer1 = new Integer(1);
        integer2 = new Integer(1);
        // false
        System.out.println(integer1 == integer2);

        // (5)
        // false
        // 重载了运算符
        System.out.println(integer1 < integer2);

        // (6)
        Boolean b1 = new Boolean(false);
        Boolean b2 = new Boolean(false);
        // false
        System.out.println(b1 == b2);

        // (7)
        b1 = false;
        b2 = false;

        // true
        System.out.println(b1 == b2);
    }

要特别注意第(2)个例子那种情况, 解释在注释中!来源: 文档
从源码也可以看出原因, Integer i = 10 实际上是调用了 Integer i = Integer.valueOf(10), 所以在一些范围内的常量, 会导致引用指向同一个对象.

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

第(3)个例子又是true了, 因为256实际上被重用了, 大概是常量池的原因.
==运算符并没有对Integer, Long这些类型做重载, 所以它就是比较两个引用是否指向了同一个对象. 即便对于Boolean也是一样.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,305评论 0 4
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,526评论 0 3
  • 北京遇上西雅图之不二情书 其实看完电影,在影院外拥吻的情侣是最好的影评了。(就是有点虐死我这个单身狗了) 电影的定...
    鱼鱼鱼鱼鱼阅读 301评论 0 0