【微知识】Integer 类型比较大小的坑

Integer 类型比较大小的“坑“。
by emanjusaka from https://www.emanjusaka.com/archives/java-Integer-equals 彼岸花开可奈何
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。
博客:https://www.emanjusaka.com
博客园:https://www.cnblogs.com/emanjusaka
公众号:emanjusaka的编程栈
Integer
作为包装类型是不能直接比较大小的,基本类型 int
可以使用 ==
比较大小,Integer
类型并不能这么比较大小。
下面我将介绍几种遇到的"坑",记录一下以防再犯。
Integer
类型比较大小的三种情况
1、操作数都是int
类型
int a = 10;
int b = 10;
System.out.println(a == b);
这个输出结果是true
,当操作数都是int
类型时,是可以用==
进行大小比较的。
2、操作数都是Integer
类型
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
这个输出结果是true
。
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
而这个输出结果是false
。
这是什么原因导致的问题呢?
Integer
类型是包装类型,使用==
比较大小实际是比较的它们的引用地址。
在 Java 中,Integer 类型存在一个缓存机制,即 Integer 缓存池(也称为 Integer 常量池),用于优化性能和减少内存占用。
默认情况下,Integer 缓存池的范围是 -128 到 127(包括两端的值)。
所以在缓存池的范围内的数,是直接使用缓存池的对象的。
127 使用缓存池,输出 true,因为指向同一个缓存对象。
128 超出缓存范围,创建新对象,输出 false,因为是不同的对象
还有两种另外初始化 Integer 的方式。
方式一:
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println(a == b); // 输出 true
方式二:
Integer a = new Integer(127);
Integer b = new Integer(127);
System.out.println(a == b); // 输出 false
方式一和方式二的输出结果不同,这是因为使用 valueOf 方法会使用缓存,而使用 new 关键字会强制创建新对象,不使用缓存。
3、当操作数一个是int
类型,另一个是Integer
类型
Integer a = 127;
int b = 127;
System.out.println(a == b);// 输出 true
当操作数一个是 int
(基本数据类型),另一个是 Integer
(包装类)时,Java 会触发自动拆箱机制,将 Integer
对象转换为 int
基本类型,然后再进行比较。
此时 ==
比较的是数值本身,而不是引用地址。
Integer
类型比较大小的正确方式
Integer
类型应该怎样比较大小,下面介绍三种方式:
1、使用 equals()
方法
Integer a = 200;
Integer b = 200;
System.out.println(a.equals(b)); // 输出 true
Integer
类重写了 equals()
方法,专门用于比较两个 Integer
对象的数值是否相等(而非引用地址)。
2、使用intValue()
方法手动拆箱
Integer a = 200;
Integer b = 200;
System.out.println(a.intValue() == b.intValue()); // 输出 true
主动调用 intValue()
方法手动拆箱,会将 Integer
类型 拆箱成 int
类型,再用 ==
比较数值是否相等。
3、使用compareTo()
方法
Integer a = 200;
Integer b = 200;
System.out.println(a.compareTo(b) == 0); // 输出 true
在 Java 中,Integer
类实现了 Comparable<Integer>
接口,因此可以使用 compareTo()
方法来比较两个 Integer
对象的大小。这种方式既可以判断相等性,也能比较大小关系。