当前位置: 首页 > 面试题库 >

2 HashMap之间的相等性

太叔鹏云
2023-03-14
问题内容

在类的equals()方法中,我使用私有实例HashMap变量进行相等性比较。但是,当比较两个对象的HashMap变量时,它们仍然显示相等。进一步的研究使我进入了链接:Link
Here
。但是,它只是说HashMap1.equals(HashMap2)不起作用的原因是“显然,如果不编写自定义代码,就无法测试Java数组的相等性”。

我不明白这个原因。谁能指导我详细说明原因?


问题答案:

equalsJava数组类型上的方法等效于==,因为Java数组“类”不会覆盖Object.equals

如果要“按值”比较数组,则需要使用适当的java.util.Arrays.equals(...)方法,或者自己实现。

如果您HashMap使用数组作为键或值,那么它将调用该数组的equals方法来测试两个映射之间的键和/或值是否相同。HashMap.equals(从您的角度来看)这会使行为异常。这就是链接文章所说的。但是,数组语义
HashMap在将数组用作键或值类 时才 影响相等性。如果您不这样做,则HashMap::equals应该可以按预期工作。

用于Map类平等的javadocs
涉及到一点,但是它们基本上归结为采用两个条目集,比较它们的大小,然后执行s1.containsAll(s2)。当然,这很昂贵,但是它 应该
Map正确实现Map接口的所有类都有效。

请注意,出于以下几个原因,将数组用作映射的键​​是一个坏主意:

  1. 在大多数情况下,数组equals和的语义hashCode对于a是错误的HashMap。对于大多数用例,您需要映射以按值而不是按对象标识比较键。
  2. 数组是可变的。如果我们假设存在针对equals/ hashcode问题的解决方法,则 可以通过修改数组键来破坏映射的不变式。


 类似资料:
  • 编者按:此代码示例来自Rust 1.0之前的版本,并且在语法上是无效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。 在下面的例子中,我们似乎无法测试平等性。为什么会这样?有解决办法吗?(我使用的是Rust 0.11)。

  • 问题内容: 在PHP中,和运算符之间有什么区别吗? 在手册中,它指出: 我猜没有太大的区别,但我很好奇。 问题答案: 在主要的Zend实现中,没有任何区别。您可以从PHP语言扫描程序的Flex描述中获取它: 生成的令牌在哪里。因此,Bison 解析器不会区分和标记,而是将它们等同对待:

  • 问题内容: 我在Postgres的平等问题上遇到了麻烦。 平等的工作方式与我期望的一样,如果在对时区进行归一化之后,如果时间相同,那么它应该为真: 但是,似乎不适用于以下情况: 但是,不平等在我期望他们如何实现的过程中起作用: 我有什么误会吗?如何以与平等相同的方式处理时区来评估平等? 问题答案: 以下是两种评估平等的方法: 在 第一个 将它添加到一个。该 第二 通过使用构建体。 但不要使用。曾经

  • 我正在寻找一种方法来声明“2个依赖项之间的依赖项”。 例如,在我的模块中,我ivy.xml以下行: 我的问题是,日志经典 1.0.13 依赖于 slf4j-api 1.7.5,而我的模块依赖于 1.6.6(slf4japiversion 的值)。 我无法更改 slf4japiversion,但将来它可以由其他人升级。 有没有办法声明对logback的依赖关系,以检索与我的slf4j api版本兼容

  • 以下是输出 第1行返回,第3行返回false。 我不明白为什么编译器不认为“name1”和“sb”包含相同的值 类似地,编译器并不认为“s”和“sb”包含相同的字符串(都是非原语)。 有人能解释一下line1和line3的输出吗?

  • 本文向大家介绍Javascript学习笔记之相等符号与严格相等符号,包括了Javascript学习笔记之相等符号与严格相等符号的使用技巧和注意事项,需要的朋友参考一下 Javascript 有两种方法来判断两种值是否相等。 相等符号 相等符号由两个等号组成: == Javascript 是弱类型语言。这就意味着相等符号为了比较两个值将会强制转换类型。 上面的代码展示了类型转换的结果,因此我们知道使