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

没有Hashcode且等于的对象作为Map键

平元明
2023-03-14
问题内容
public class Contact
{
    int i;
    String name;
    public Contact(int iVal, String nameVal)
    {
        i = iVal;
        name = nameVal;
    }
}

public class MultiMap
{
    public static void main (String args[])
    {
        java.util.HashMap m = new java.util.HashMap();
                Contact m1 = new Contact(1, "name");
        Contact m2 = new Contact(1, "name");
        m.put(m1, "first");
        m.put(m2, "second");
        System.out.println(m.get(m1));
        System.out.println(m.get(m2));
    }
}

输出为:

first 
second

这种“获取”方法的行为如何?由于m1和M2都具有相同的值,并且我没有重写hashcode(),因此将调用对象类的equals()方法吗?

这样对吗 ?

  1. 没有哈希码方法,因此JVM无法查看对象m1和m2是否包含不同的值
  2. 没有覆盖equals的方法,因此调用了Object类的equals(),并且由于两个对象都不相同,因此上面的代码可以很好地工作,而无需m2替换m1的值。

问题答案:

如果类没有覆盖hashCode()equals(Object o)方法,则Java仅使用对内存中对象的实际引用来计算值(即,检查它是否与类的实例化相同)。这就是为什么您仍然获得两个结果的原因。



 类似资料:
  • 问题内容: 我想转换火花数据框架以使用以下代码添加: 详细的错误消息是: 有人知道我在这里做错了吗?谢谢! 问题答案: 您无法使用数据框,但可以将数据框转换为RDD并通过映射将其映射。在Spark 2.0之前,别名为。使用Spark 2.0,您必须先明确调用。

  • 问题内容: 我有其他人编写的此Python工具来刷新某个微控制器,但他为Python 2.6编写了该工具,而我使用的是Python 3.3。 因此,我移植了其中的大部分内容,但此行出现了问题: 该函数在Python 3中不存在,必须替换为。但是然后,作为参数获取的函数将导致异常: 但是到目前为止,我在文档中看到的是,必须将可迭代类型与一个大可迭代类型连接在一起,我是否缺少某些东西? 我要怎么做才能

  • 问题内容: 如果我只需要比较对象并且还不打算将对象放入任何基于哈希的容器中,我是否只能实现equals()而不是hashCode()? 似乎所有Java圣经都说这两个必须一起实现。:( 我的担心:-如果我始终将hashCode()与equals()一起实现,将有很多未真正使用的代码,并且没有单元测试的内容。(如果不使用,我不会进行单元测试hashCode())-直到将对象放入基于哈希的容器中时,我

  • 在阅读equals()和hashcode()时,我了解到,如果两个对象相等,那么它们的hashcode必须相等,反之亦然。 但是下面的例子并没有反映这一点。 如果是,则返回true,即使它们的哈希代码不同,这从打印和中可以明显看出。 有人能给我解释一下吗?

  • 问题内容: 令V为一个具有单个属性的类,该属性名为K以及其getter和setters。 如果执行该怎么办: 据我所知,这应该会引起某种问题,因为映射键应该是不变的。这里会发生什么? 编辑:认为该键不是字符串,而是如下文所述的可变对象。 问题答案: 这个问题的标题具有误导性-您没有更改map键,就像在更改 用作map key的对象时一样 。当您说时,您将创建一个聚合两个独立值的 映射条目 : ke

  • 问题内容: 是否有与C ++等效的Java Map keySet()? Java 方法返回“此映射中包含的键的设置视图”。 问题答案: 也许以下可能有用: 使用STL兼容序列(例如std :: vector,std :: deque或std :: list)的 make_key_set 函数的重载可以如下所示: