关于自动拆装箱时的陷阱

 1 package part10;
 2 
 3 /*
 4  * 自动装箱的陷阱
 5  * 1、两个包装类进行比较时,包装类的"=="运算在不遇到算术运算的情况下不会自动拆箱,如下例若判断c==g则会报编译错误;
 6  * 2、两个包装类进行比较时, 包装类的"equals()"方法不处理数据转型的关系,如下例的g.equals(a+b)为false;
 7  * 3、对于Integer类,当值在-128-127之间时,会使用Integer.ValueOf()方法直接从缓存中取出相应对象,
 8  * 而当值不在这个范围内时会使用Integer.ValueOf()方法new一个Integer对象,如下例的e和f不是同一个对象
 9  * 的引用,而c和d是同一个对象的引用;
10  * 4、当一个包装类与一个基本数据类型进行比较或两个基本数据类型进行比较时,"=="运算会自动拆箱、自动类型转换。
11  */
12 public class AutomaticPackingTest {
13     
14     public static void main(String[] args) {
15         Integer a = 1;
16         Integer b = 2;
17         Integer c = 3;
18         Integer d = 3;
19         Integer e = 321;
20         Integer f = 321;
21         Long g = 3L;
22         int h = 321;
23         int i = 321;
24         long j = 321;
25         
26         System.out.println(c==d);
27         System.out.println(e==f);
28         System.out.println(e.equals(f));
29         System.out.println(h==i);
30         System.out.println(i==e);
31         System.out.println(c==(a+b));
32         System.out.println(c.equals(a+b));
33         System.out.println(g==(a+b));
34         System.out.println(g.equals(c));
35         System.out.println(g.equals(a+b));
36         System.out.println(i==j);
37         System.out.println(j==e);
38         System.out.println(e.equals(j));
39     }
40 
41 }

运行结果为:

原文地址:https://www.cnblogs.com/zhangyu-720/p/9976021.html