Integer是int的包装类,这意味着它是一个对象而不是原始数据类型。当你使用 `==` 比较两个 Integer对象时,实际上是在比较它们的引用是否指向同一个对象。
但是,当两个Integer对象的值都在 `-128` 到 `127` 之间时,Java 会自动复用这些对象以节省内存,这时 `==` 将会得到正确的结果(即它们的值是否相等)。对于超出这个范围的值,除非两个对象是通过相同的new Integer()或者 `Integer.valueOf()` 方法创建的,并且指向同一个缓存的对象,否则 `==` 比较的结果应该根据引用是否相同来判断结果。
下面为实际例子:
Integer a = 100;
Integer b = 100;
Integer c = new Integer(100);
Integer d = new Integer(100);
a和b都是通过自动装箱创建的Integer对象,因为它们的值在 `-128` 到 `127` 之间,所以它们指向同一个对象,因此 a == b返回 true。
c通过 `new Integer(100)` 创建,但 `Integer.valueOf(100)` 也会从缓存中获取对象,因此a == c也返回true。
d同样通过 `new Integer(100)` 创建,但由于c和d是不同的对象,即使它们有相同的值c == d仍然返回 `false`。
Integer a = 200;
Integer b = 200;
Integer c = new Integer(200);
Integer d = new Integer(200);
如果值是200,那么a == b的结果就会是false,因为超出了默认的缓存范围,将会创建两个不同地址的Integer对象,所有引用的比较结果是false
同理a == c的结果也是false
进行引用类型的等于比较时,对值做比较一般调用equals()方法,如a.equals(b),此时比较的是值