int和Integer有什么区别

Java是一个近乎纯洁的面向对象编程语言,可是为了编程的方便仍是引入了基本数据类型,可是为了可以将这些基本数据类型当成对象操做,Java为每个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得两者能够相互转换。面试

public static void main(String[] args) {
    Integer a = new Integer(3);
    Integer b = 3;                  // 将3自动装箱成Integer类型
    int c = 3;
    System.out.println(a == b);     // false 两个引用没有引用同一对象
    System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
  }

还有一个面试题,也是和自动装箱和拆箱有点关系的,代码以下所示:编程

public static void main(String[] args) {
    Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
    System.out.println(f1 == f2);
    System.out.println(f3 == f4);
  }

若是不明就里很容易认为两个输出要么都是true要么都是false。首先须要注意的是f一、f二、f三、f4四个变量都是Integer对象引用,因此下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当咱们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,代码以下:app

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之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,因此上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。编程语言

相关文章
相关标签/搜索