Java。 ArrayList中的contains方法不工作
问题描述:
我检查,如果ArrayList包含的对象:Java。 ArrayList中的contains方法不工作
List<Property> propertiesByName = getPropertiesByCategory(propertyCategory);
for(Property property: propertiesByName){
List<Property> propertyList = getVariationItem().getProperties();
Galgo.log("*******************");
Galgo.log(propertyList.toString());
Galgo.log(property.toString());
Galgo.log("contains:"+propertyList.contains(property));
}
我得到以下日志:
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='red'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='blue'}
contains:false
Database: get 2 variations
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='42'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='34'}
contains:false
正如你可以在第一和第三种情况看,它应返回true 。哪里不对?
我的代码的其他部分。第一种按类别(颜色,大小)获取属性的方法。第二种方法是让所有可用的属性:
private List<Property> getPropertiesByCategory(String category){
List<Property> properties = new ArrayList<>();
for(Property property: getAllProperties()){
if(property.getName().equals(category)){
if(!properties.contains(property)){
properties.add(property);
}
}
}
return properties;
}
private List<Property> getAllProperties() {
List<Property> propertyList = new ArrayList<>();
for(VariationItem variationItem: getProductItem().getVariationsList()){
for(Property property: variationItem.getProperties()){
if(!propertyList.contains(property))
{
propertyList.add(property);
}
}
}
return propertyList;
}
答
要使用contains
方法,你必须覆盖equals()
和hashCode()
方法来实现这一目标。你可以检查这个答案执行https://*.com/a/16069158/1320616。其实会比较两个对象。并且要比较两个对象,您必须执行equals()
方法。
编辑:以下是完整细节
因此,当您使用含有()它是什么做的是
@Override public boolean contains(Object object) {
Object[] a = array;
int s = size;
if (object != null) {
for (int i = 0; i < s; i++) {
if (object.equals(a[i])) {
return true;
}
}
} else {
for (int i = 0; i < s; i++) {
if (a[i] == null) {
return true;
}
}
}
return false;
}
,如果你没有在你的类实现equals()方法,它会采取从对象类,这是
public boolean equals(Object o) {
return this == o;
}
所以,现在它减少到==被两个对象之间使用对它们进行比较的方法equals()
。当您在两个对象之间放置==时,它会根据两件事情进行比较(a)两个对象的哈希码(b)它使用两个对象的toString()
。
每个对象都有不同的哈希码分配给它们。这就是为什么你的没有给你正确的结果。
答
,您可以检查的字符串是这样的:
Galgo.log("contains:"+propertyList.toString().contains(property.toString()));
可以显示一个例子,请 –
检查这个例子http://javapapers.com/core-java/hashcode-and-equals-methods-override/ –