zoukankan      html  css  js  c++  java
  • Integer 和 int的种种比较

      public static void main(String[] args) {
            int i = 128;
            Integer i2 = 128;
            Integer i3 = new Integer(128);
            //Integer会自动拆箱为int,所以为true
            System.out.println(i == i2);   // 1
            System.out.println(i == i3);   // 2
            System.out.println("**************");
            Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
            Integer i6 = 127;
            System.out.println(i5 == i6);//true  // 3
            /*Integer i5 = 128;
            Integer i6 = 128;
            System.out.println(i5 == i6);//false    // 4
    */        Integer ii5 = new Integer(127);
            System.out.println(i5 == ii5); //false    // 5
            Integer i7 = new Integer(128);
            Integer i8 = new Integer(123);
            System.out.println(i7 == i8);  //false   // 6
        } 

    首先,1和2输出结果都为true,因为Integer和int比都会自动拆箱(jdk1.5以上)。

    3的结果为true,而4则为false,很多人都不动为什么。其实java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:

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

    看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以3的结果为true,而4为false。

    对于5和6,因为对象不一样,所以为false。

    我对于以上的情况总结如下:

      ①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
      ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
      java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
      ③两个都是new出来的,都为false
      ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

    引用:http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html

  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/skyLogin/p/7772614.html
Copyright © 2011-2022 走看看