ArrayList的行为<>()。contains(Object obj)

时间:2014-07-17 06:24:34

标签: java arraylist

这不是实际问题,它更像是一个问题。方法contains(Object obj)如何检查对象是否存在于集合中?我有简单的样本,让我有点困惑。 我有两个列表,第一个列表oldList = new ArrayList<FtpFileInfo>()和第二个列表newList = new ArrayList<FtpFileInfo>() oldList包含类似的内容:

newone.txt
test.txt
test2.txt

和newList包含:

newone.txt
test.txt
test2.txt
test3.txt

在简单的for-each循环中,我检查newList中是否存在newList中的任何对象,如果没有,我将它放到名为outputList的新列表中:

for(FtpFileInfo newFile : newList) {
    if(!oldList.contains(newFile)) {
        outputList.add(newFile.getFilename());
    }
}

我怀疑这个列表的输出应该是:

test3.txt

但我明白了:

newone.txt
test.txt
test2.txt
test3.txt

我尝试过相同的例子但是使用了String对象,一切都按照我的想法运行,所以我的例子出了什么问题,或者这个行为是由FtpFileInfo对象引起的?

3 个答案:

答案 0 :(得分:0)

How exactly method contains(Object obj) checks if object exists in collection? 

每个实施都实施了contains()方法

ArrayList<>()

public boolean contains(Object o) {
    return indexOf(o) >= 0;
}

然后

 public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i])) // important 
                return i;
    }
    return -1;
}

现在您看到需要正确实施equals()

解。

equals()

中正确覆盖FtpFileInfo方法

答案 1 :(得分:0)

来自Java docs for ArrayList

  

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。

答案 2 :(得分:0)

看起来您需要覆盖FtpFileInfo.equals(Object)方法。默认情况下,它会比较两个对象是否在内存中的同一地址,而不是它们是否代表相同的东西。

这样的事情会取得正确的结果,但它不是最好的方法:

@Override
public boolean equals(Object obj) {
    return (obj instanceof FtpFileInfo) && (toString().equals(obj.toString()));
}