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的类型系统中,没有办法以通用的方式处理它们。 当然,如果你在我们的地图中没有原始数组,那么你不需要处理这种情况。


    平等可以是不同的东西:它是相同的参考(参考平等)? 还是它有相同的内容?

    数组的问题是它们是可变的。 equalshashCode必须始终成对,并且散列码不应改变(否则在哈希表中不能找到对象)。 因此,正常的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[]

    下一篇: Wordnet edit tree structure