java - 数组是否具有固有的 hashCode()?
问题描述
假设我想创建 aHashSet
或 a HashMap
,其键是原始类型的数组,如下所示:
Set<int[]> setOfIntArrays = new HashSet<>();
Map<char[], String> mapOfCharArrays = new HashMap<>();
这些结构将用于数组的哈希码是什么?
我知道根类Object
包含hashCode()
,因此它可以用于任何继承类的实例(其中它可能被覆盖或不被覆盖)。该类为所有原始类型的数组Arrays
提供了一堆静态hashCode(...)
方法。这些方法是否也“内置”为原始类型数组的(覆盖)实例方法?由于数组在集合和映射中充当普通类,因此这样做似乎是合乎逻辑的。但是,没有用于类的 javadoc,int[]
而且 JLS 中的“数组”一章也没有阐明这种情况。
解决方案
hashCode
根据JLS 10.7(添加了重点) ,数组确实有:
数组类型的成员全部如下:
公共最终字段长度,其中包含数组的组件数。长度可以是正数或零。
公有方法clone,覆盖Object类中的同名方法,不抛出检查异常。数组类型 T[] 的克隆方法的返回类型是 T[]。
多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。
从类 Object 继承的所有成员;Object 唯一不被继承的方法是它的 clone 方法。
这意味着hashCode
继承自Object
,因此是基于身份的,并且不依赖于数组中的值。
这可能是你想要的,但我建议它可能不是。如果您想要基于数组中的值的哈希码,则需要将数组包装在某个实现合理的等号和哈希码的类中。
推荐阅读
- android - RecyclerView 的 onClick 无法单击项目,仅当您单击 BETWEEN 项目时:已解决
- javascript - TypeError: undefined is not a constructor (评估 'new Intl.RelativeTimeFormat('en', { style: 'short', numeric: "auto" })')
- javascript - 连接查询参数并将它们添加到 url
- moq - 如何在 netcore 3.0 上模拟 ILogger.LogXXX 方法
- python - 如何在 MapBox 上显示来自 GeoDjango 的 GeoJson 点层
- string - 将 PWideChar 转换为字符串。我应该使用 WideCharToString 吗?
- python-3.x - 如何在 pdf 中搜索关键短语并提取该段落
- arrays - 打印 JSON 对象中的所有内容
- apache-spark - Pyspark UDF 酸洗错误,无法酸洗 SwigPyObject 对象
- openshift - 部分安装 OpenShift 模板资源