我对Java中HashSet
和HashMap
的内部实现有点困惑。
这是我的理解,所以如果我错了,请纠正我:
< code>HashSet或< code>HashMap都不允许重复的元素。
< code>HashSet由< code>HashMap支持,所以在< code>HashSet中,当我们调用< code >时。add(element),我们在元素上调用< code>hashCode()方法,并在内部对内部< code>HashMap执行< code>put(k,v),其中键是< code>hashCode,值是实际的对象。因此,如果我们尝试将相同的对象添加到< code>Set中,它将看到< code>hashCode已经存在,然后用新值替换旧值。
但是,当我读到HashMap在HashMap
中将我们自己的对象作为键存储时,HashMap
是如何工作的,这对我来说似乎不一致。在这种情况下,我们必须覆盖 hashCode(
) 和 equals() 方法并使它们彼此一致,因为,如果我们找到具有相同 hashCode 的键,它们将转到同一个存储桶,然后为了区分具有相同 hashCode
的所有条目,我们必须遍历条目列表以在每个键上调用方法 equals()
并找到匹配项。因此,在这种情况下,我们允许具有相同的哈希代码,并且我们创建一个存储桶,其中包含具有相同
哈希代码
的所有对象的列表,但是使用 HashSet
,如果我们已经找到一个哈希代码
,我们将旧值替换为新值。
我有点困惑,有人能给我解释一下吗?
关于< code>HashMap的行为,您是正确的,但是关于< code>HashSet的实现,您是错误的。
HashSet
在内部由HashMap
支持,但您添加到HashSet
的元素用作后备HashMap
中的键。对于该值,使用了虚拟值。因此HashSet
的包含(元素)
只是调用后备HashMap
的包含键(元素)
。
我们在HashMap中插入的值充当map对象的键,对于其值,java使用常量变量。因此,在键值对中,所有键都具有相同的值。
你可以参考这个链接https://www.geeksforgeeks.org/hashset-in-java/
哈希映射:-基本上哈希映射作为键和值工作,如果我们想将数据存储为键值对,那么我们将转到哈希映射,基本上当我们使用哈希映射插入数据时,基本上内部它会遵循 3 思考,1.哈希码 2..等于 3.==
当我们在哈希映射中插入数据时,它会使用哈希码将数据存储在桶中(快速输入),如果在同一个bocket中有2个数据存储,那么就会发生键冲突来解决这个键冲突,我们使用(==)方法,总是==方法检查对象的引用,如果两个对象的哈希码相同,那么第一个替换为第二个,如果哈希码不相同,那么哈希冲突就会发生,解决这个哈希冲突,我们将使用(。检查内容是否相同?如果内容相同,则第一个替换为第二个,如果两个内容不同,它将在bocket中创建另一个对象并存储数据