java HashMap如何进行链接?如何访问所有碰撞值?

发布于 2024-12-22 16:00:37 字数 663 浏览 1 评论 0原文

我在某处读到 HashMap 使用链接来解决冲突。但如果真是这样的话。我如何访问具有相同键值的所有元素。

例如:

HashMap<Integer, String> hmap = new HashMap<Integer, String>();
hmap.put(1, "1st value");
hmap.put(1, "2nd value");
hmap.put(1, "3rd value");
hmap.put(1, "4th value");

现在,如果我执行 hmap.get(1) 它会返回“第四个值”,

如果它确实像这样链接

关键值1“第四值”---> “第三值”---->“第二值”----> “第一值”

如何获得其他值?

hmap.get(1) 仅返回第一个值。

我的第二个问题是,

它是否进行线性链接。如何删除某个键的任何一个值。假设我想从哈希图中删除“第四个值”并希望保留同一键的所有其他值,我该怎么做?

如果我这样做

hmap.remove(1);

,它删除了完整的链。

I have read somewhere that HashMap uses chaining to resolve collisions. But if that is the case. how can i access all the elements with same key value.

For example :

HashMap<Integer, String> hmap = new HashMap<Integer, String>();
hmap.put(1, "1st value");
hmap.put(1, "2nd value");
hmap.put(1, "3rd value");
hmap.put(1, "4th value");

Now, if I do hmap.get(1) it returns “4th Value”

if Indeed it does chaining like

Key values 1 “4th Value” ---> “3rd Value”--->”2nd Value”---->
“1st Value”

How can I get the other values?

hmap.get(1) only returns the 1st value.

My second question is,

if it does linear chaining. How can I remove any one value for a key. suppose I want to remove “4th value” from my hashmap and want to keep all other values for same key, how can i do it?

if I do

hmap.remove(1);

, it removes the complete chain.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

月光色 2024-12-29 16:00:37

HashMap 无法存储同一个键的多个值。

链接用于解决哈希冲突,即不同键具有相同哈希的情况。因此,这不是用相同的键存储多个值,而是关于其键具有相同哈希值的多个值。

可以为同一键存储多个值的数据结构称为多重映射。不幸的是,JRE 中没有内置的 multimap 实现。

如果您需要多重映射,您可以维护 ListMap (按照 matsev 的建议),或者使用第三方库中的现有多重映射实现,例如Google Guava

另请参阅:

HashMap cannot store multiple values for the same key.

Chaining is used to resolve hash collisions, i.e. situations when different keys have the same hash. So, it's not about storing multiple values with the same key, it's about multiple values whose keys have the same hashes.

Data structure that can store multiple values for the same key is called a multimap. Unfortunately, there is no built-in implementation of multimap in JRE.

If you need a multimap, you can maintain a Map of Lists (as suggested by matsev), or use an existing multimap implementation from a third-party library, such as Google Guava.

See also:

蝶…霜飞 2024-12-29 16:00:37

来自 的文档HashMap.put(K, V):

将指定值与此映射中的指定键关联起来。如果映射之前包含键的映射,则旧值将被替换。

您可以做的是将 List 作为您的,例如

HashMap<Integer, List<String>> hmap = new HashMap<Integer, List<String>>();
List<String> list = hmap.get(1);
if (list == null) {
    list = new ArrayList<String>();
    hmap.put(1, list);
}
list.add("1st value");
list.add("2nd value");
// etc

From the documentation of HashMap.put(K, V):

Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.

What you can do is to put a List as your value, e.g.

HashMap<Integer, List<String>> hmap = new HashMap<Integer, List<String>>();
List<String> list = hmap.get(1);
if (list == null) {
    list = new ArrayList<String>();
    hmap.put(1, list);
}
list.add("1st value");
list.add("2nd value");
// etc
旧人九事 2024-12-29 16:00:37

我不认为 HashTable 允许重复的键。您应该阅读此重复密钥时会发生什么被放入 HashMap 中?

I don't think HashTable allows duplicate keys. You should read this What happens when a duplicate key is put into a HashMap?

许一世地老天荒 2024-12-29 16:00:37

显然,您正在寻找像 Guava 的 MultiMap 这样的数据结构完全允许您想要的:每个键有多个值。

Java 的 HashMap 不进行链接,如 put(K, V) 的文档明确指出:

public V put(K key, V value)

将指定值与此映射中的指定键关联起来。如果
映射之前包含键的映射,旧值是
已替换。

You're obviously looking for a data structure like Guava's MultiMap which allows exactly what you want: Having multiple values per key.

Java's HashMap does not do chaining, as the documentation for put(K, V) clearly states:

public V put(K key, V value)

Associates the specified value with the specified key in this map. If
the map previously contained a mapping for the key, the old value is
replaced.

2024-12-29 16:00:37

如果您在 HashMap 中存储现有键,那么它将用新值覆盖旧值,并且 put() 将返回旧值

      System.out.println(hmap.put("1",1st value));
      System.out.println(hmap);  // o/p "1st value"

If you store an existing key in the HashMap then it will override the old value with the new value and put() will return the old value

      System.out.println(hmap.put("1",1st value));
      System.out.println(hmap);  // o/p "1st value"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文