Java 学习笔记

所有文章
📖 最新文章 transmittable-thread-local 库 JOOR 反射库 Lombok 库:为你减少样板代码 Slf4j 日志组件的使用 加速maven、gradle依赖下载
📖 Java 基础 安装 第一个程序 使用 UTF-8 编写代码 空值 null 正则表达式 线程 日期/时间 匿名类 枚举 ThreadLocal 线程本地变量 动态代理 jar 命令

Java Integer之间的比较


  • 两个变量对应两个对象,它们之间用==判等结果的是false。
  • 两个变量,引用同一个对象,它们直接用==判等结果的是true。
  • null 之间用==判等结果的是true。
  • 对象之间的值比较,用 equals 。要考虑两个都是null结果是true是否符合业务预期。
  • Integer 之间,Integer和int 之间如果比较大小,则Integer会自动拆箱。
  • Integer 之间的值比较,用 equals。

示例1

// 使用 Integer.valueOf 生成 Integer 对象
System.out.println( Integer.valueOf(1) >= Integer.valueOf(2) );
System.out.println( Integer.valueOf(1000) >= Integer.valueOf(2000) );
System.out.println( 1 >= Integer.valueOf(2) );
System.out.println( 1000 >= Integer.valueOf(2000) );

// 使用 new Integer 生成对象
System.out.println( new Integer(1) >= new Integer(2) );
System.out.println( new Integer(1000) >= new Integer(2000) );
System.out.println( 1 >= new Integer(2) );
System.out.println( 1000 >= new Integer(2000) );
System.out.println( new Integer(2) <= 1 );
System.out.println( new Integer(2000) <= 1000 );
System.out.println( new Integer(1) == new Integer(1) );
System.out.println( new Integer(1000) == new Integer(1000) );

结果都是 false。

示例2

System.out.println( 1 == new Integer(1) );
System.out.println( 1000 == new Integer(1000) );
System.out.println( new Integer(1) == 1 );
System.out.println( new Integer(1000) == 1000 );

结果都是 true。

示例3

这个示例是乍一看是不符合预期的:

System.out.println( Integer.valueOf(1) == Integer.valueOf(1) );        // true
System.out.println( Integer.valueOf(1000) == Integer.valueOf(1000) );  // false

Integer num1 = 1;
Integer num1000 = 1000;
System.out.println( num1 == Integer.valueOf(1) );        // true
System.out.println( num1000 == Integer.valueOf(1000) );  // false

System.out.println( (Integer)1 == Integer.valueOf(1) );        // true
System.out.println( (Integer)1000 == Integer.valueOf(1000) );  // false

直接上结论: * Oracle JDK 在自动装箱时使用的 Integer.valueOf 将 int 变成 Integer。 * 使用 Integer.valueOf 时,对于[-128, 127]范围内的数字,会使用缓存起来的Integer对象,所以两个 Integer.valueOf(1) 指向的是同一个对象。具体见 Integer.valueOf 源码:

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

( 本文完 )

文章目录