HashSet和HashMap在Java中是如何工作的?

HashSet和HashMap在Java中是如何工作的?,java,hashmap,hashset,Java,Hashmap,Hashset,我对java中的HashSet和HashMap的内部实现有点困惑 这是我的理解,如果我错了,请纠正我: HashSet或HashMap都不允许重复元素 HashSet由HashMap支持,因此在HashSet中,当我们调用.add(element)时,我们在元素上调用hashCode()方法,并在内部对内部HashMap执行放置(k,v),其中,键是hashCode,值是实际对象。因此,如果我们尝试将相同的对象添加到集合,它将看到hashCode已经存在,然后用新值替换旧值 但是,当我读到Has

我对java中的
HashSet
HashMap
的内部实现有点困惑

这是我的理解,如果我错了,请纠正我:

HashSet
HashMap
都不允许重复元素

HashSet
HashMap
支持,因此在
HashSet
中,当我们调用
.add(element)
时,我们在元素上调用
hashCode()
方法,并在内部对内部
HashMap
执行
放置(k,v)
,其中,键是
hashCode
,值是实际对象。因此,如果我们尝试将相同的对象添加到
集合
,它将看到
hashCode
已经存在,然后用新值替换旧值

但是,当我读到
HashMap
如何将我们自己的对象作为键存储在
HashMap
中时,我觉得这似乎不一致。 在这种情况下,我们必须重写
hashCode()
equals()
方法,并使它们彼此一致,因为如果我们找到具有相同
hashCode
的键,它们将进入相同的存储桶,然后,为了区分具有相同
hashCode
的所有条目,我们必须迭代条目列表,在每个键上调用方法
equals()
,并找到匹配项。 因此,在本例中,我们允许使用相同的
hashCode
,并创建一个bucket,其中包含具有相同
hashCode
的所有对象的列表,但是使用
HashSet
,如果我们已经找到
hashCode
,我们将旧值替换为新值


我有点困惑,有人能给我澄清一下吗?

关于
HashMap
的行为,您是正确的,但是关于
HashSet
的实现,您是错误的


HashSet
由内部的
HashMap
支持,但是您添加到
HashSet
的元素被用作支持
HashMap
中的键。对于该值,使用虚拟值。因此,
HashSet
包含(元素)
只需调用backing
HashMap
containsKey(元素)
我们在HashMap中插入的值充当map对象的键,对于其值,java使用常量变量,所有将具有相同的

你可以参考这个链接

哈希映射:-基本上哈希映射作为键和值,如果我们想将数据存储为键和值对,那么我们将转到哈希映射,基本上当我们在内部使用哈希映射插入数据时,它将遵循3思考, 1.hashcode 2.平等 三,==


当我们在散列映射中插入数据时,它将使用散列代码将数据存储在bucket(fast in)中,如果在同一个bocket中有两个数据存储,那么密钥冲突将发生来解决此密钥冲突。我们使用(==)方法,始终==方法检查对象的引用,如果两个对象哈希代码相同,则第一个替换为第二个如果哈希代码不相同,则会发生哈希冲突要解决此哈希冲突,我们将使用(.equal)方法。equal方法基本上会检查内容,如果两个内容相同,那么它将返回true,否则它将返回false,因此在哈希映射中它将检查内容是否相同?如果内容相同,则第一个替换为第二个如果两个内容不同,则将在bocket中创建另一个对象并存储数据

哈希集:-基本上哈希集用于一次存储一组对象,内部哈希集也仅使用哈希映射,当我们在内部使用add方法插入somethink时,它将调用put方法,并将数据存储在hashmap键中bcz hash map键始终唯一且不允许重复这是不允许hashset也唯一且不允许重复的方式,如果我们在hashst中输入duplicate也不允许通过任何异常第一个将替换为第二个值,它将在值中存储常量数据“PRESENT”

您可以观察到内部hashmap对象包含hashset元素作为键,常量“PRESENT”作为其值。 其中,present是常量,定义为 私有静态最终对象存在=新对象()