equals 和 == 在面试中经常被问到也是很容易出错的地方,一般会以阅读代码写输出结果的形式考察,下面我们来看一下这个题目:
请写出下面代码段中输出的结果

//第一组对比
Integer num1=10;
Integer num2=10;
System.out.println(num1==num2);
System.out.println(num1.equals(num2));

//第二组对比
Integer num3=35888;
Integer num4=35888;
System.out.println(num3==num4);
System.out.println(num3.equals(num4));

//第三组对比
Integer num21=-10;
Integer num22=-10;
System.out.println(num21==num22);
System.out.println(num21.equals(num22));

//第四组对比
Integer num23=-35888;
Integer num24=-35888;
System.out.println(num23==num24);
System.out.println(num23.equals(num24));

一些基础不牢靠的开发人员往往会在面试的时候将上面的所有输出都写成 true,一些基础还算牢靠的开发人员往往把第二组和第四组的输出结果都写成 true。出现这两个问题的原因主要是对 equals 、 == 以及 Integer 不是很了解,下面我就讲解以下。
在 Java 语言中 == 进行的是 *对象* 比较,而 equals 进行的是 ** 比较。其次 Integer 类型的变量在进行赋值的时候会进行装箱操作,装箱的时候首先会对值进行判断,如果所赋的值在 *-128* 到 *127* 之间的话就会返回 Integer 中已经创建好的对象,如果不在这个范围内则返回新的对象,这一点我们通过查看 Integer 源码也能发现。
我们再来看看下面这道题,请输出最终结果:

final String pig = "length:9";
final String dog = "length: " + pig.length();
//第一组对比
System.out.println(pig==dog);
//第二组对比
final String dog1 = ("length: " + pig.length()).intern();
System.out.println(pig==dog1);
System.out. println("Animals are equal: "+ pig == dog);

上面这道题比第一道题稍微复杂点,如果你能回到正确这道题说明你的基础很扎实。下面我来讲解以下这道题中涉及到的知识点。在 Java 中常量表达式通过运算得到的字符串是在编译期计算得来的,并在后续的运行中作为常量字符串来处理,但是在运行期通过字符串拼接的形式得到的字符串是新创建出来的。除了这两个情况还存在一个特殊的情况,就是第二组对比中 dog1 赋值的情况,它通过显示的限定运算得到了字符串也被称为常量字符串。

Tip:Integer、Long、Char、Short、Double、Float、String 都存在装箱拆箱的过程。