# 漫画：Integer 竟然有 6 种比较方式？

## 代码测试

```public class IntegerTest {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
}
}```

true false

```public class IntegerTest {
public static void main(String[] paramArrayOfString) {
Integer integer1 = Integer.valueOf(127);
Integer integer2 = Integer.valueOf(127);
System.out.println((integer1 == integer2));
Integer integer3 = Integer.valueOf(128);
Integer integer4 = Integer.valueOf(128);
System.out.println((integer3 == integer4));
}
}```

```public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}```

```private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}```

【强制】所有整型包装类对象之间值的比较，全部使用 equals 方法比较。

#### 注意事项

```public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);
}
}```

false

## 其他比较方式

### compareTo

```public final class Integer extends Number implements Comparable<Integer> {
// 忽略其他内容
}```

compareTo 的使用如下：

```public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1.compareTo(i2));
}
}```

0

compareTo 的源码如下：

```public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}```

### 直接运算

compareTo 方法给我们了一个启发，我们可以直接将两个值进行相减，如果相减的值等于 0，则说明对比的两个值是相同的，示例代码如下：

```public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println((i1 - i2) == 0);
}
}```

true

### intValue

```public class IntegerTest {
public static void main(String[] args) {
Integer i = 558;
Integer i2 = 558;
System.out.println(i.intValue() == i2.intValue());
}
}```

true

### 异或

• 1 异或 0=1
• 0 异或 0=0
• 1 异或 1=0

```public class IntegerTest {
public static void main(String[] args) {
Integer i = 558;
Integer i2 = 558;
System.out.println((i ^ i2) == 0);
}
}```

true

## 扩展知识：IntegerCache 值域修改

IntegerCache 默认的取值范围为 -128 到 127，但我们可以通过设置启动参数来调整 IntegerCache 的最大缓存值，比如我们可以配置虚拟机的启动参数 `-XX:AutoBoxCacheMax=1000`，此配置表示将缓存的最大值设置为 1000，如果是 Idea 的配置如下：

```public class IntegerTest {
public static void main(String[] args) {
Integer i1 = 999;
Integer i2 = 999;
System.out.println(i1 == i2);
}
}```

true

## 总结

0 条评论

• ### c#生成一组不同的随机数的方法

#region 生成不同随机数的方法 /// <summary> /// 生成不同随机数的方法 /// </summary> /// <param name="...

• ### Spring Boot 最佳实践（五）Spring Data JPA 操作 MySQL 8

JPA（Java Persistence API）Java持久化API，是 Java 持久化的标准规范，Hibernate是持久化规范的技术实现，而Spring...

• ### Java Integer(-128~127)值的==和equals比较产生的思考

最近在项目中遇到一个问题，两个值相同的Integer型值进行==比较时，发现Integer其中的一些奥秘，顺便也复习一下==和equals的区别，先通过Damo...

• ### Java开发知识之Java的包装类

包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同.

• ### JavaSE的自动装箱和自动拆箱

内心怀揣自己的真是答案，我们看看下边的源代码： 先看看Integer装箱和拆箱的函数源码：

• ### 再谈Integer对象比较

在上一篇文章中介绍了Integer的特性及面试中常考的几个知识点，本篇文章再做些扩充。

• ### 基本数据类型的包装类

JAVA 并不是纯面向对象的语言。Java 语言是一个面向对象的语言，但是 Java 中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转...

• ### 面试官六连问拆箱装箱Integer那些事，给我整懵圈了！

小萌：由于基本数据类型不是对象，所以java并不是纯面向对象的语言，好处是效率较高（全部包装为对象效率较低）。Java是一个面向对象的编程语言，基本类型并不具有...