这不是实际问题,它更像是一个问题。方法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对象引起的?
答案 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)
如果此列表包含指定的元素,则返回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()));
}