我前一天接受采访,对哈希图进行询问时我无语
这几个

我们可以将密钥设为单例吗?

我们能否使哈希图的密钥可变或不可变,您将选择哪一个?为什么?

对于第二个问题,我在网上搜索后发现,如果我们正在创建密钥,则它应该是不可变的,否则,数据将保存在第一个密钥上,然后再进行修改,如果我们再次尝试获取它,它将为null,因此对象将丢失。
这是我为此Custom Key Hashmap所遵循的链接

关于第一个问题,我们可以创建Hashmap密钥单例吗?根据我的说法,如果创建密钥单例,那么如果我们尝试使用单例密钥进行添加,则失去使用相同密钥的哈希映射的能力将替换数据。

请给它一些照明。

最佳答案

嗯,这很有趣。

首先,Java中的Singleton类是一次只能有一个对象(该类的实例)的类。
这意味着多个对象之间只能共享一个副本。

我们有两个单例类的对象

Singleton x = Singleton.getInstance();
Singleton y = Singleton.getInstance();

场景1:如果我们使用Singleton键创建HashMap,则
Map<SingletonClass, Interger> map = new HashMap<>();
        map.put(x, 10);
        map.put(y, 20);

您认为输出将是什么,
在这种情况下,大小将为1,而20将覆盖10。
同一对象具有相同的HashCode并等于方法的实现。

方案2:如果一个对象正好改变Singleton类的字段值,该怎么办
Map<SingletonClass, Interger> map = new HashMap<>();
    map.put(x, 10);
    y.s = (y.s).toUpperCase(); // s is a String field in Singleton Class
    map.put(y, 20);

在这种情况下,大小将为1。x和y的哈希码相同。

因此,总是有1个对象,它将一次又一次地覆盖该值。

如您所知,为什么我们使用Immutable类作为键。现在很明显,您不能将HashMap中的Singleton类用作键。

即使您覆盖了HashCode对象,因为键也作为引用存储在Map中。因此,如果更改其实现,则在执行Singleton Class的哈希码方法时,它会反映在Map中。
是的,您可以重写equals方法,但它只会增加HashMap中的冲突情况。

10-06 13:48
查看更多