Java ArrayList:contains()方法在arraylist包含给定对象时返回false

时间:2012-11-13 12:36:21

标签: java arrays arraylist contains evaluation

我的contains()方法存在问题,即使ArrayList包含给定的Object,也会返回false。 我的代码如下:

String [] transaction = dbConnection.getPendingTransaction(username);
if (!onlineConnection.getSentTransactionRequests().contains(transaction)) {
    onlineConnection.getSentTransactionRequests().add(transaction);

    String packet = "RTR" + "_" + transaction[0] + "_" + transaction[2] + 
                        "_" + transaction[3] + "_" + transaction[4];
    onlineConnection.send(packet);
}

我在迭代之间尝试了Thread.sleep(),因此ArrayList没有成功地加载。{/ p>

6 个答案:

答案 0 :(得分:7)

对于这个问题,hashCode()equals()数组有点不完整(这是一个长期不同的讨论原因)。

可能的解决方法是使用ArrayList<ArrayList<String>>代替ArrayList<String[]>equals()的{​​{1}}方法将按预期使用。

例如:

ArrayList

将按预期产生 ArrayList<String> l1 = new ArrayList<>(); ArrayList<String> l2 = new ArrayList<>(); l1.add("asdf"); l2.add("asdf"); ArrayList<ArrayList<String>> coll = new ArrayList<>(); coll.add(l1); System.out.println(coll.contains(l2));

答案 1 :(得分:1)

如果它应该返回SAME数组而不是创建新数组,请查看getPendingTransaction和getSentTransactionRequests。其次,尝试调试并查找数组对象id。如果这不相同,但应该是(并包含相同的元素),请尝试解决此问题(例如创建比较器或List等)。

答案 2 :(得分:1)

问题是数组的equals被定义为引用相等。换句话说,根据equals方法,包含相同元素的两个不同数组不相等。

如果您想要equals进行&#34;交易&#34;要基于字符串相等的对象,您需要创建一个自定义类来保存String[],并覆盖equals方法和hashcode方法。


顺便说一下,数组equals(Object)方法不是&#34;有点坏了&#34;。 equals的定义语义只是反映了任何数组对象本身都是可变的这一事实。

答案 3 :(得分:0)

这是因为String [] transaction是对象。当您调用contains列表时,使用equals方法将新对象与其他对象进行比较。想象它就像做

new Object().equals(new Object())

答案 4 :(得分:0)

如果您必须使用List<String[]>,可能您似乎没有使用equals()hashCode() ......

也许您最好创建比较对象的方法

这样的东西
public static boolean stringArrayListEquals(List<String[]> list, List<String[]> list2) {
    if (list.size() != list2.size()) return false;
    for (int i = 0; i < list.size(); ++i){
        if (!Arrays.equals(list.get(i), list2.get(i)) return false;
    }
    return true;
}

要测试contains(),您需要另一个循环...

虽然您应该认真使用List<List<String>>

答案 5 :(得分:0)

我也遇到过类似的问题。我刚刚写了以下片段:

assertContains(list, toLookFor);  // To call the below private method  

private void assertContains(ArrayList<String> list, String toLookFor) {
        String arrayListToString = rulesList.toString();
        
         if (arrayListToString.contains(toLookFor))
                System.out.println("The list contains "+ toLookFor);
            else
                System.out.println("The list does not contains "+ toLookFor);
        
    }