首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >deepEquals -列表相等,集合不相等

deepEquals -列表相等,集合不相等
EN

Stack Overflow用户
提问于 2014-03-09 02:32:42
回答 1查看 714关注 0票数 3

我有一个由Eclipse生成的带有hashCode()和equals()的类M(请参见下文)。

两个M相等的列表是相等的,两个M相等的集合是不相等的。

这是deepEquals()中的一个bug,还是我感到困惑?

代码语言:javascript
复制
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));
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-09 02:40:30

问题是您的对象没有返回相同的哈希码。您需要使用Arrays.deepHashCode()代替(参见http://ideone.com/qPyWLh)。

这似乎是Eclipse中已知的一个bug:bug.cgi?id=422717

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22277707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档