gpt4 book ai didi

java - 我们可以创建 hashmap 键单例吗?

转载 作者:行者123 更新时间:2023-12-01 14:14:07 25 4
gpt4 key购买 nike

前几天我正在接受采访,当在 hashmap 上进行提问时,我无言以对
这里有几个

我们可以将 key 设为单例吗?

我们可以让 hashmap 的 key 可变或不可变,你会选择哪一个,为什么?

对于第二个问题,我通过网络搜索,发现如果我们正在创建 key ,它应该是不可变的,否则数据保存在第一个 key 上,然后稍后修改,如果我们再次尝试获取它,它将给出 null,因此对象将丢失。
这是我为这个 Custom Key Hashmap 关注的链接

第一个问题呢?我们可以创建 Hashmap 键单例吗?根据我的说法,如果我们创建键单例,那么如果我们尝试使用单例键添加,我们将失去使用相同键的 hashmap 的能力将替换数据。

请给它一些亮点。

最佳答案

嗯,这很有趣。

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

我们有两个 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,而 10 被 20 覆盖。对吗?
相同的对象具有相同的 HashCode 和 equals 方法实现。

场景 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 类的 hashcode 方法时反射(reflect)在 Map 中。
是的,您可以覆盖 equals 方法,但它只会增加 HashMap 中的冲突情况。

关于java - 我们可以创建 hashmap 键单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59189744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com