【问题标题】:How to use Java 7+ 'Objects.hash()' with arrays?如何将 Java 7+ 'Objects.hash()' 与数组一起使用?
【发布时间】:2015-05-21 21:53:16
【问题描述】:

我真的很喜欢 Java 7+ 的写作风格hashCode() 方法:

@Override
public int hashCode() {
    Objects.hash(field1, field2);
}

但它不能与数组一起正常工作。以下代码:

@Override
public int hashCode() {
    Objects.hash(field1, field2, array1, array2);
}

不会起作用,因为array1array2 将调用常规hashCode() 而不是Arrays.hashCode()

如何以正确的方式将Objects.hash() 与数组一起使用?

【问题讨论】:

  • 你可能不得不使用Arrays.deepHashCode
  • @LouisWasserman - 你能详细说明为什么我需要使用 deep 哈希码吗?

标签: java arrays java-7 hashcode


【解决方案1】:

你可以试试:

Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));

这与创建一个包含field1field2array1 的内容和array2 的内容的数组相同。然后在这个数组上计算Arrays.hashCode

【讨论】:

    【解决方案2】:

    Arrays.deepHashCode 将发现数组中的数组(通过instanceof Object[])并递归调用自身。 见code

    如果数组包含其他数组作为元素,则哈希码基于它们的内容等等,无穷无尽。

    @Override
    public int hashCode() {
        Object[] fields = {field1, field2, array1, array2};
        return Arrays.deepHashCode(fields);
    }
    

    拥有像Objects.hash 这样的参数版本会很有用,但您必须自己编写:

    public final class HashUtils {
        private HashUtils(){}
    
        public static int deepHashCode(Object... fields) {
            return Arrays.deepHashCode(fields);
        }
    }
    

    用法:

    @Override
    public int hashCode() {
        return HashUtils.deepHashCode(field1, field2, array1, array2);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 2012-01-20
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2019-09-22
      • 2018-02-09
      相关资源
      最近更新 更多