Java:比较HashMap <String,Object>如果值可能是Object []
我有以下具有属性键和值的HashMap:
private HashMap<String, Object> prop_values;
我需要检查它的一个实例是否与另一个实例相同。 在过去,我只是这样做了:
if (prop_values_1.equals(prop_values_2)){
// do something
}
这工作,直到我有Object[]
作为一个值。 所以,我以前的表达式总是在这个带有任何Object[]
值的HashMap
上返回false
。
所以,我必须实现这个方法:
private boolean isPropValuesEquals(HashMap<String, Object> pv1, HashMap<String, Object> pv2){
boolean isEquals = true;
if (pv1 == null || pv2 == null){
return false;
}
if (!pv1.keySet().equals(pv2.keySet())){
return false;
}
for (String key : pv1.keySet()){
Object cur_pv1 = pv1.get(key);
Object cur_pv2 = pv2.get(key);
if (cur_pv1 instanceof Object[]){
if (cur_pv2 instanceof Object[]){
isEquals = Arrays.equals((Object[])cur_pv1, (Object[])cur_pv2);
} else {
return false;
}
} else {
isEquals = isEquals && cur_pv1.equals(cur_pv2);
}
if (!isEquals){
return false;
}
}
return isEquals;
}
它有效,但它似乎是某种破解,我不确定这是实现我所需的最佳方式。
所以,这里有两个问题:
为什么Object []。equals()与Arrays.equals()不一样? 这似乎很痛苦。
如果值可以是Object[]
,是否有比较HashMap<String, Object>
更好的方法?
深层次的问题是无法覆盖数组的equals()
。 为什么它不是首先被写成“同等顺序的元素”,我不知道。 它肯定是可能的(除非有一些不明确的理由不这样做;我想不出任何;如果你想检查参考平等,你使用==
,那么equals()
损害什么?)。
您的解决方案是要走的路。 只需要考虑一些细节:
您可以使用x.getClass().isArray()
代替x instanceof Object[]
,因此它也适用于其他数组,例如int[]
(它不是Object[]
的子类)。 下行:您可能需要分别检查x
是否为null
。
如果数组可能包含嵌套数组,请考虑使用Arrays.deepEquals()
。
原始数组不是Object[]
的示例:
Object a = new int[1];
System.out.println("" + (a instanceof Object[])); // false
System.out.println("" + a.getClass().isArray()); // true
屁股的另一个痛苦是即使你发现x
是一个数组,你仍然必须为所有不同的基元素类型分别处理。 在Java的类型系统中,没有办法以通用的方式处理它们。 当然,如果你在我们的地图中没有原始数组,那么你不需要处理这种情况。
平等可以是不同的东西:它是相同的参考(参考平等)? 还是它有相同的内容?
数组的问题是它们是可变的。 equals
和hashCode
必须始终成对,并且散列码不应改变(否则在哈希表中不能找到对象)。 因此,正常的equals
(和hashCode
)不能使用数组内容,它们必须依赖数组的另一个(不可变)属性,这是参考。
Object类的equals方法实现对象上最可能的等价关系; 也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x == y的值为true)时,此方法返回true。
链接地址: http://www.djcxy.com/p/10699.html上一篇: Java: compare HashMap<String, Object> if value might be an Object[]