【问题标题】:Checking for zero in Java ArrayList using contains()使用 contains() 检查 Java ArrayList 中的零
【发布时间】:2015-05-12 02:20:55
【问题描述】:

我有这段代码 sn-p,它基本上是在 long 整数的 ArrayList 中检查 0 值。

import java.io.*;
import java.util.*;

class main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        long zero = 0;

        ArrayList<Long> alist = new ArrayList();        
        alist.add (zero);

        if (alist.contains(0))
            System.out.println ("contains zero");
        else
            System.out.println ("contains no zero");
    }
}

我得到的输出是contains no zero。相当令人不安! 这是错误还是预期行为?

【问题讨论】:

  • 我检查了 C++ 的 vector(最接近 Java 的 ArrayList?)是否具有相同的行为,但似乎并非如此。这是一个示例 C++ 代码 - ideone.com/ID0WbK

标签: java c++ vector arraylist integer


【解决方案1】:

将此逻辑检查更改为:alist.contains(0L)。此行为与自动装箱/拆箱有关。 int 被装箱到 Integerlong 被装箱到 Long。在您的列表中,您输入了一个 long(装箱为 Long),然后您搜索了一个 int(装箱为 Integer)......所以您找不到它。

【讨论】:

    【解决方案2】:

    peter.petrov 解释了导致错误输出的原因,我只想补充一点,尽量避免使用硬代码,直到您有必要。如果您将其编码为 if (alist.contains(zero))你可以得到想要的结果。

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • 这是一个“盲目的最佳实践”的例子。名称zero 不包含额外的语义信息,并且局部变量不提供灵活性。 (即它要么仍然是一个“幻数”,但现在你通过给它一个完全毫无价值的名字来增加噪音,这对解决问题没有任何帮助;或者这个数字的含义是不言而喻的而不是“魔法”一开始。)这样的编码绝对不会改善你的程序;你并没有避免硬编码。
    • @msrd0 我已经浏览了这里的文档,我知道如何回答以及我目前的特权是什么,无论如何感谢您的建议。
    • @Leushenko 作为问题陈述“这是一个错误还是预期的行为?”所以在我看来,代码正在做它必须做的事情并不是一个错误,我只是添加以使答案更有用。代码中的 0 是整数,而零是长整数,感谢 peter.petrov
    猜你喜欢
    • 2013-07-05
    • 2014-08-20
    • 2016-02-06
    • 2018-08-21
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多