出现错误(以Integer为例):当两个Integer类型的数据,用==比较时会出现不相等的情况。
public static void main(String[] args) { for (int i = 120; i < 300; i++) { Integer a = i; Integer b = i; System.out.println(i + " " + (a == b)); } }
运行结果:
120 true
1211 true
122 true
123 true
...
127 true
128 false
129 false
130 false
...可以从运行结果看,其实128以后就不想等了,这是为什么?
我们先来了解包装类型常量池有效取值范围:(图片来源:脚本之家)
其实对于包装类型有一个装箱拆箱的过程
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
当Integer取值在常量池范围之内,对JVM为了节省空间, 当Integer的值落在-128~127之间时,。如果是,则i1,i2直接是引用已存在对象,当超出常量池取值范围,则每次都会新建对象。Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为-128~127时的Integer对象。
大家可以参考:以下博主帖子
Integer同值比较也不一定相等 | Java Debug 笔记 - 掘金
java两个integer数据判断相等用==还是equals_java_脚本之家
我直接说解决方法把:
不用”==“ 使用Integer.compareTo或equals