gpt4 book ai didi

当哈希值发生变化时,Java HashSet 元素不会重新排列自己

转载 作者:行者123 更新时间:2023-12-01 08:09:58 26 4
gpt4 key购买 nike

import java.util.*;
class KeyMaster {
public int i;
public KeyMaster(int i) { this.i = i; }
public boolean equals(Object o) { return i == ((KeyMaster)o).i; }
public int hashCode() { return i; }
}

public class MapIt {
public static void main(String[] args) {
Set<KeyMaster> set = new HashSet<KeyMaster>();
KeyMaster k1 = new KeyMaster(1);
KeyMaster k2 = new KeyMaster(2);
set.add(k1); set.add(k1);
set.add(k2); set.add(k2);
System.out.print(set.size() + “:”);
k2.i = 1;
System.out.print(set.size() + “:”);
set.remove(k1);
System.out.print(set.size() + “:”);
set.remove(k2);
System.out.print(set.size());
}
}

结果是什么?

A. 4:4:2:2
C. 2:2:1:0
E. 2:1:0:0
G. 4:3:2:1
B. 4:4:3:2
D. 2:2:0:0
F. 2:2:1:1
Answer: F

谁能解释一下答案。我的疑问是这个。 K2 的我改变了,但 set 仍然有 2 个元素,我认为其中之一仍然指的是更改后的 k2 引用的对象。那么为什么删除(k2)不起作用?

最佳答案

值仅在添加到集合时才会进行哈希处理,更改哈希结果不会导致值在集合中重新哈希。

因此,假设您的 HashSet 有两个存储桶,一个的哈希码为 1,另一个的哈希码为 2,当您添加它们时,k1 将进入存储桶 1,k2 将进入存储桶 2。

当您将 k2s 值更改为 1 时,它不会在 HashSet 中重新排列自身。

当您尝试删除 k2 时,由于 i 的值,它会散列到存储桶 1,因为存储桶中没有任何内容匹配(因为您已经删除了 k1),因此不会删除任何内容。

HashSet#remove如果删除了任何内容,则返回 boolean 值;如果您打印出来,您将看到 k2 的删除并未发生。

关于当哈希值发生变化时,Java HashSet 元素不会重新排列自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18240827/

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