我的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>
答案 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);
}