Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 深度相等-列表相等,集合不相等_Java_List_Set_Equals_Deepequals - Fatal编程技术网

Java 深度相等-列表相等,集合不相等

Java 深度相等-列表相等,集合不相等,java,list,set,equals,deepequals,Java,List,Set,Equals,Deepequals,我有一个由Eclipse生成的带有hashCode()和equals()的类M(请参见下文) 两个M相等的列表是相等的,两个M相等的集合是不相等的 这是deepEquals()中的一个bug还是我感到困惑 import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; class M { @Ov

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

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

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

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));
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.LinkedHashSet;
导入java.util.List;
导入java.util.Set;
M类{
@重写公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+Arrays.hashCode(b);
返回结果;
}
@覆盖公共布尔等于(对象obj){
如果(this==obj)返回true;
if(obj==null)返回false;
如果(getClass()!=obj.getClass())返回false;
M其他=(M)obj;
如果(!Arrays.deepEquals(b,other.b))返回false;
返回true;
}
int[]b=新的int[3][3];
}
公共阶级平等{
静态列表(对象o){
ArrayList l=新的ArrayList();
l、 添加(o);
返回l;
}
静态集合(对象o){
Set l=新的LinkedHashSet();
l、 添加(o);
返回l;
}
公共静态void main(字符串[]args){
M f=新的M();
M g=新的M();
List listWithF=列表(f);
ListListWithG=列表(g);
System.out.println(“列表:“+listWithF.equals(listWithG));
Set setWithF=Set(f);
Set setWithG=Set(g);
System.out.println(“集合:“+setWithF.equals(setWithG));
}
}

问题在于对象返回的哈希代码不相等。您需要改用
Arrays.deepHashCode()
(参见示例)

这似乎是Eclipse中的已知错误: