java中地图与列表的比较

java中地图与列表的比较,java,comparison,hashmap,Java,Comparison,Hashmap,我最近遇到了一个好问题, 我有一张地图 LinkedHashMap<String, List<MyCustomObject>> LinkedHashMap 我需要将其与另一个映射进行比较,如果数据库中的数据相同,则将使用完全相同的方法填充该映射 真正发生的是,我在时间0填充map1,在时间t填充map2,使用相同的java方法(当我这么说时,我的意思是使用相同的DB/表等) 因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望如此!!) 现

我最近遇到了一个好问题, 我有一张地图

 LinkedHashMap<String, List<MyCustomObject>>
LinkedHashMap
我需要将其与另一个映射进行比较,如果数据库中的数据相同,则将使用完全相同的方法填充该映射

真正发生的是,我在时间0填充map1,在时间t填充map2,使用相同的java方法(当我这么说时,我的意思是使用相同的DB/表等) 因此,如果数据库端的数据相同,那么这两个映射应该具有相同的内容,顺序相同(希望如此!!)

现在我想比较这两个映射,如果它们不相等(即从数据库中获取了一些新数据),那么我想做一些操作。如果它们相同,我只想保持这样

有人能给我指点一下图坦卡门,让我明白怎么做吗

序列化是这个问题的答案吗

谢谢,
Neeraj

只需使用
equals

if (!map1.equals(map2)) {
    //they differ
}

您必须在
MyCustomObject
上实现
equals
(和
hashCode
!),因为(如果我理解正确的话)对象将具有相同的内容但不同的标识(默认的
equals
只是比较指针-即对象所在的内存地址).

只要使用
等于

if (!map1.equals(map2)) {
    //they differ
}

您必须在
MyCustomObject
上实现
equals
(和
hashCode
!),因为(如果我理解正确的话)对象将具有相同的内容但不同的标识(默认的
equals
只是比较指针-即对象所在的内存地址)

这是他们必须说的:

将指定的对象与 这是平等的地图。如果 给定的对象也是一个映射和 两个映射表示相同的映射。 更正式地说,两个映射t1和t2 表示相同的映射,如果 t1.entrySet().equals(t2.entrySet())。 这确保了equals方法 在不同的环境中正常工作 映射接口的实现


确保您的
MyCustomObject
类实现了适当的
equals
hashcode
方法,这样就很容易得到
map1.equals(map2)
的结果

这是他们必须说的:

将指定的对象与 这是平等的地图。如果 给定的对象也是一个映射和 两个映射表示相同的映射。 更正式地说,两个映射t1和t2 表示相同的映射,如果 t1.entrySet().equals(t2.entrySet())。 这确保了equals方法 在不同的环境中正常工作 映射接口的实现


其他答案很好,这里有一个例子,确实,map函数迭代键和值(并比较列表中的项目)来进行相等比较。正如他们所说,您需要重写hashCode和equals

static public List<String> getStringList(String... arg) {
    ArrayList<String> arrayList = new ArrayList<String>();
    for(int x=0;x<arg.length;x++) arrayList.add(arg[x]);
    return arrayList;
}

static public void main(String[] arg) {
    LinkedHashMap<String, List<String>> mapA = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapB = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapC = new LinkedHashMap<String, List<String>>();
    mapA.put("same", getStringList("a", "b", "c"));
    mapB.put("same", getStringList("a", "b", "c"));
    mapC.put("same", getStringList("a", "b", "d"));
    System.out.println(mapA.equals(mapB) ? "true" : "false");
    System.out.println(mapA.equals(mapC) ? "true" : "false");
}
静态公共列表getStringList(字符串…arg){
ArrayList ArrayList=新的ArrayList();

对于(int x=0;x来说,其他答案都很好,下面是一个例子,事实上,map函数通过遍历键和值(以及比较列表中的项)来进行相等比较。正如他们所说,您需要重写hashCode和equals

static public List<String> getStringList(String... arg) {
    ArrayList<String> arrayList = new ArrayList<String>();
    for(int x=0;x<arg.length;x++) arrayList.add(arg[x]);
    return arrayList;
}

static public void main(String[] arg) {
    LinkedHashMap<String, List<String>> mapA = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapB = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapC = new LinkedHashMap<String, List<String>>();
    mapA.put("same", getStringList("a", "b", "c"));
    mapB.put("same", getStringList("a", "b", "c"));
    mapC.put("same", getStringList("a", "b", "d"));
    System.out.println(mapA.equals(mapB) ? "true" : "false");
    System.out.println(mapA.equals(mapC) ? "true" : "false");
}
静态公共列表getStringList(字符串…arg){
ArrayList ArrayList=新的ArrayList();

对于(int x=0;xd)您想知道两者的区别吗?还是只是想知道两者是否不同?我只是想知道它们是否不同。Java序列化不是答案。
equals
有什么问题?调用equals会不会考虑遍历列表(每个键的值)同时迭代所有的键,并同时进行比较??首先要确保从数据库中提取记录,以确保映射是有序的。如果是这样,你的LinkedHashMap将根据本问题中引用的javadocs是有序的:你想知道不同点吗或者你只是想知道两者是否不同?我只是想知道它们是否不同。Java序列化不是答案。
equals
有什么问题吗?调用equals是否需要遍历列表(每个键的值)同时迭代所有键,同时进行比较??首先必须确保从数据库中提取记录,以确保映射有序。如果是这种情况,则LinkedHashMap将根据本问题中引用的javadocs有序: