从Java 1.5中,你几乎可以互换Integer使用int在许多情况下.
但是,我发现我的代码中存在一个潜在的缺陷让我感到有些惊讶.
以下代码:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
Run Code Online (Sandbox Code Playgroud)
虽然我无法确定在什么情况下,但是当值相等时,似乎错误地设置了不匹配.我在Eclipse中设置了一个断点,看到这些Integer值都是137,我检查了布尔表达式并且它说它是假的,但当我跨过它时,它设置不匹配为真.
将条件更改为:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
有谁可以解释为什么会这样?到目前为止,我只在自己的PC上看到了我的localhost上的行为.在这种特殊情况下,代码成功地通过了大约20次比较,但在2次失败.问题始终可以重现.
如果这是一个普遍的问题,它应该导致我们的其他环境(开发和测试)出错,但到目前为止,没有人在执行此代码片段的数百次测试后报告该问题.
==用于比较两个Integer值仍然不合法吗?
除了下面的所有精细答案之外,以下stackoverflow链接还有相当多的附加信息.它实际上已经回答了我原来的问题,但因为我没有在我的问题中提到自动装箱,所以它没有出现在选定的建议中:
考虑两个类型为Integer的引用,它们调用静态工厂方法valueOf,如下所示: -
Integer a = Integer.valueOf("10");
Integer b = Integer.valueOf("10");
Run Code Online (Sandbox Code Playgroud)
考虑到Integer是不可变的,可以使用==而不是使用equals方法来比较a和b.我猜测valueOf方法确保只创建一个值为10的Integer实例,并为每个使用值10创建的Integer返回对此实例的引用.
一般来说,通过使用==而不是equals来比较使用对同一静态工厂方法的调用创建的不可变类的两个引用是否可以?
编辑:Integer类仅用作示例.我知道如果使用==进行比较,那么Intgers高达127将返回true.我需要知道的是,当升创建自己的不可变类,说MyImmutable用的方法创建(),这将确保不会创建重复MyImmutable对象,会是确定的,如果我比较使用由create方法创建2个MyImmutable引用使用==而不是等于.