从Java 1.5中,你几乎可以互换Integer
使用int
在许多情况下。
但是,我发现代码中存在潜在的缺陷,这让我有些惊讶。
如下代码:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
值相等时,似乎无法正确设置不匹配,尽管我无法确定在什么情况下。我在Eclipse中设置了一个断点,发现Integer
值都为137,并且检查了布尔表达式,并说它是假的,但是当我越过它时,它会将不匹配设置为true。
将条件更改为:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
解决了问题。
谁能阐明为什么会这样?到目前为止,我只在自己的PC上的本地主机上看到了该行为。在这种情况下,代码成功地进行了约20次比较,但在2次失败。该问题始终可再现。
如果这是一个普遍存在的问题,则可能会在我们的其他环境(开发和测试)上引起错误,但是到目前为止,在执行了此代码段的数百次测试之后,没有人报告过该问题。
==
比较两个Integer
值是否仍然不合法?
除了以下所有出色的答案之外,下面的stackoverflow链接还有很多附加信息。它实际上会回答我原来的问题,但是因为我没有在问题中提及自动装箱,所以它没有出现在所选建议中:
为什么编译器/ JVM不能使自动装箱“正常工作”?
JVM正在缓存Integer值。==仅适用于-128至127之间的数字 http://www.owhtml" target="_blank">asp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching
问题内容: 我有一些想要添加到ArrayList中的值,以跟踪显示的数字。这些值是整数,因此我创建了一个ArrayList; 但是我无法使用此方法将任何东西添加到ArrayList中。如果我使用Strings作为数组列表,它将起作用。我必须将其设置为String数组,然后以某种方式将其转换为整数吗? 编辑:我还有另一个问题。我希望列表仅包含3个值。我该怎么办? 问题答案: 的清单。
问题内容: 我不了解你们,但是至少我期望在下面的代码中f1等于f2,但是显然不是这样!您对此有何看法?看来我必须编写自己的equals方法来支持它,对吗? 问题答案: 不,不是这样。因为 equals 在比较绝对路径的相等性(在您的情况下,它类似于: 因此,它们自然是不同的。 看来我必须编写自己的equals方法来支持它,对吗? 可能是。但是首先,您必须知道要比较什么?仅路径名?如果是,请按照以下
问题内容: 在Python 3中,我正在检查给定值是否为三角形,也就是说,对于某个正整数n,它可以表示为n(n + 1)/ 2 我可以写: 还是我需要这样做?: 我检查了两个函数对于x的返回结果是否相同,直到1,000,000。但是我不确定一般来说int(x)== x是否总是可以正确确定一个数字是否为整数,因为例如5表示为4.99999999999997等。 据我所知,第二种方法是正确的方法,如果
我有一个函数<code>公共静态列表 如果,输出将是因为5 5 2=12如果,输出将是因为5 5 5=25。如果,输出将是因为2 1=3。 我正在努力理解将它实现为代码背后的逻辑,所以这是我目前所知道的: 有人可以解释解决此类问题背后的逻辑,以便我可以进行必要的更改吗? 谢谢。
问题内容: 我是一名普通的C#开发人员,但有时我会使用Java开发应用程序。我想知道是否有Java等效于C#async / await?简单来说,java相当于什么: 问题答案: 不,在Java中-甚至在v5之前的C#中,都没有等效的异步/等待方式。 在后台构建状态机是一项相当复杂的语言功能。 Java中对异步/并发的 语言 支持相对较少,但是该软件包包含许多与此相关的有用 类 。(不完全等同于任
问题内容: 我想知道和占用的内存是否存在差异 。 我知道通常占用4个字节,怎么样 问题答案: 通常,热点中的Java对象使用的堆内存包括: 对象标头,由几个字节的“内务处理”信息组成; 存储器为 原始 字段,根据它们的大小(中间体N-> 32位) 用于 参考 字段的存储器(每个4字节)(整数n-> 32位) 填充:可能在对象数据之后一些“浪费”的未使用字节,以使每个对象都从一个方便的字节数开始的地