deepEquals - Списки равны, Наборы не
У меня есть класс M с hashCode() и equals(), сгенерированные Eclipse (см. Ниже).
Два списка с равными M равны, Два набора с равными M не равны.
Это ошибка в deepEquals() или я запутался?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
class M {
@Override public int hashCode() {
final int prime=31;
int result=1;
result=prime*result+Arrays.hashCode(b);
return result;
}
@Override public boolean equals(Object obj) {
if(this==obj) return true;
if(obj==null) return false;
if(getClass()!=obj.getClass()) return false;
M other=(M)obj;
if(!Arrays.deepEquals(b,other.b)) return false;
return true;
}
int[][] b=new int[3][3];
}
public class SetEquality {
static List<Object> list(Object o) {
ArrayList<Object> l=new ArrayList<>();
l.add(o);
return l;
}
static Set<Object> set(Object o) {
Set<Object> l=new LinkedHashSet<>();
l.add(o);
return l;
}
public static void main(String[] args) {
M f=new M();
M g=new M();
List<Object> listWithF=list(f);
List<Object> listWithG=list(g);
System.out.println("lists: "+listWithF.equals(listWithG));
Set<Object> setWithF=set(f);
Set<Object> setWithG=set(g);
System.out.println("sets: "+setWithF.equals(setWithG));
}
}
1 ответ
Решение
Проблема в том, что ваши объекты не возвращают одинаковые хеш-коды. Вам нужно использовать Arrays.deepHashCode()
вместо этого (см., например, http://ideone.com/qPyWLh).
Похоже, это известная ошибка в Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=422717.