【每天一道面试题】Integer、 new Integer() 、int的==比较,你全都了解吗

简介: 【每天一道面试题】Integer、 new Integer() 、int的==比较,你全都了解吗

面试题


说下面的整数类型之间比较的结果,以及原因

Integer i = new Integer(50);
Integer j = new Integer(50);
System.out.print(i == j);  // ?
Integer i = new Integer(50);
Integer j = 50;
System.out.print(i == j); // ?
Integer i = 50;
Integer j = 50;
System.out.print(i == j); //?
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //?
Integer i = new Integer(50); 
int j = 50;
System.out.print(i == j); //?
Integer i = 50; 
int j = 50;
System.out.print(i == j); //?

大家都知道答案吗?


分析


主要考察你对基础知识的掌握,基本类型和包装类型,以及包装类型的缓存机制。


答案


最终输出的结果如下:

Integer i = new Integer(50);
Integer j = new Integer(50);
System.out.print(i == j);  // false
Integer i = new Integer(50);
Integer j = 50;
System.out.print(i == j); // false
Integer i = 50;
Integer j = 50;
System.out.print(i == j); // true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); // false
Integer i = new Integer(50); 
int j = 50;
System.out.print(i == j); // true
Integer i = 50; 
int j = 50;
System.out.print(i == j); // true

首先我们区分下几个概念:

  1. Integer 是int的包装类, int是java中的基本类型,他们可以进行自动装箱、拆箱
  2. Integer的默认值是null, int的默认值是0
  3. Integer是一个对象,数据存储在堆山,变量存储着堆中的地址引用。int直接存储数据值,加载到栈上运算。


场景一: 两个new Integer()变量比较


结论: 两个new Integer()变量比较,永远false

原因: 因为new Integer()相当于在堆中开辟了一个新的空间,存放数据,内存地址必然不通,所以为false。

Integer i = new Integer(50);
Integer j = new Integer(50);
System.out.print(i == j);  // false


场景二: Integer和new Integer()变量比较


结论:Integer变量和new Integer()变量比较,永远false

原因:new Integer()指向的是堆中新建对象的地址, Integer x = 1中指向的可能堆中的地址也有可能是缓存中的数据,无论哪种情况,他们都是不一致的。

Integer i = new Integer(50);
Integer j = 50;
System.out.print(i == j); // false


场景三: 两个Integer变量比较

Integer i = 50;
Integer j = 50;
System.out.print(i == j); // true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); // false

结论: 两个Integer变量比较,如果变量值在区间-128到127之间,则结果为true, 如果变量不在次范围内,结果为false。

原因:Integer i = 50, 编译后会自动装箱变成 Integer i = Integer.valueOf(50), 然后我们看下valueOf的源码如下:

public static Integer valueOf(int i) {
    // 如果i大于等于IntegerCache中的-128,小于等于127,就会从缓存中获取,
    // 而缓存中的caches在初始化new出来
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
    // 如果不在上面的区间内,则新建对象
        return new Integer(i);
    }

1671113149604.jpg

根据源码得知,如果是在缓存范围内,会直接从缓存中获取,那么他们取到的是同一个对象,他们的地址也是一样的, == 为true, 否则为false。


场景四: 基本类型和Integer、new Integer()变量比较


Integer i = new Integer(50);  //自动拆箱为 int i=100; 此时,相当于两个int的比较
int j = 50;
System.out.print(i == j); // true
Integer i = 50; 
int j = 50;
System.out.print(i == j); // true

结论: 基本类型int和Integer、new Integer()变量比较时,只要两个值相等,则为true

原因: 包装类Integer遇到基本类型int时,自动会拆箱成int, 实际上就变成了两个int变量的比较。我们查看编译后的结果:i.intValue() == j,通过调用intValue()方法进行拆箱操作。

public int intValue() {
        return value;
    }


衍生扩展


因为 == 比较的不可靠,所以建议大家进行等值比较的时候用equals, 上面无论哪种情况,用equals准没错。

不仅int,Java中的另外7中基本类型都可以自动装箱和自动拆箱,其中也有用到缓存。见下表:

1671113186824.jpg

目录
相关文章
|
3月前
|
Java
【Java基础面试三十二】、new String(“abc“) 是去了哪里,仅仅是在堆里面吗?
这篇文章解释了Java中使用`new String("abc")`时,JVM会将字符串直接量"abc"存入常量池,并在堆内存中创建一个新的String对象,该对象会指向常量池中的字符串直接量。
|
3月前
|
Java
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
这篇文章解释了Java中`int`基本数据类型和其包装类`Integer`之间的区别,并指出在进行`==`运算时,`Integer`会拆箱为`int`类型,然后比较它们的值是否相等。
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
|
3月前
|
Java
【Java基础面试十】、何对Integer和Double类型判断相等?
这篇文章讨论了如何在Java中正确比较`Integer`和`Double`类型的值,指出不能直接使用`==`操作符比较不同类型,而应该将它们转换为相同的基本数据类型(如`double`)后进行比较。
【Java基础面试十】、何对Integer和Double类型判断相等?
|
3月前
|
Java
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
3月前
|
Java
【Java基础面试二十八】、使用字符串时,new和““推荐使用哪种方式?
这篇文章讨论了在Java中使用字符串时,推荐使用双引号`""`直接量方式而不是使用`new`操作符,因为`new`会在常量池之外额外创建一个对象,导致更多的内存占用。
|
3月前
|
存储 缓存 Java
int 和 Integer 哪一个占用更多内存?
【8月更文挑战第21天】
94 0
|
6月前
|
缓存 安全 Java
Java的Integer和int有什么区别?
Java的Integer和int有什么区别?
55 1
|
6月前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
6月前
|
编译器 程序员 C语言
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(下)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
42 0
|
6月前
|
编译器 C语言 C++
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(中)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
49 0