我对java中HashSet
和HashMap
的内部实现感到有点困惑。
这是我的理解,所以如果我错了请纠正我:
HashSet
或HashMap
都不允许重复元素。
HashSet
由HashMap
支持,因此在HashSet
调用.add(element)
时,我们在元素上调用hashCode()
方法并在内部调用对内部put(k,v)
执行HashMap
,其中键为hashCode
,值为实际对象。因此,如果我们尝试将同一个对象添加到Set
,它会看到hashCode
已经存在,然后用新值替换旧值。
但是,当我在HashMap
中将我们自己的对象存储为密钥时,{I} HashMap
如何工作时,这似乎与我不一致。
在这种情况下,我们必须覆盖hashCode()
和equals()
方法并使它们在彼此之间保持一致,因为如果我们找到具有相同hashCode
的密钥,它们将转到同一个存储桶,然后要区分具有相同hashCode
的所有条目,我们必须迭代条目列表以在每个键上调用方法equals()
并找到匹配项。
所以在这种情况下,我们允许具有相同的hashCode
,并且我们创建一个包含所有具有相同hashCode
的对象的列表的存储桶,但是如果我们已经找到,则使用HashSet
hashCode
,我们用新值替换旧值。
我有点困惑,有人可以向我澄清一下吗?
答案 0 :(得分:8)
您对HashMap
的行为是正确的,但您对HashSet
的实施是错误的。
HashSet
在内部由HashMap
支持,但您添加到HashSet
的元素将用作支持HashMap
中的关键字。对于该值,使用虚拟值。因此,HashSet
contains(element)
只会调用支持HashMap
containsKey(element)
。
答案 1 :(得分:0)
我们在HashMap中插入的值充当地图对象的键,并且对于其值,java在键中使用常量变量 .So-值对,所有键将具有相同值。
答案 2 :(得分:0)
哈希图:-基本上哈希图作为键和值工作,如果我们想将数据存储为键和值对,那么我们将进入哈希图,基本上,当我们基本上在内部使用哈希图插入数据时,它将遵循3想 1.哈希码 2.等号 3。==
当我们在哈希图中插入数据时,它将使用哈希码将数据存储在存储桶中(快入),如果在同一存储桶中有2个数据存储,则会发生键冲突要解决此键冲突,我们使用(==)方法,始终==方法检查对象的引用,如果两个对象的哈希码相同,则将第一个替换为第二个,如果哈希码不相同,则哈希碰撞将碰巧解决此哈希冲突,我们将使用(.equal)方法.equal方法基本上将检查内容,如果两个内容相同,则将返回true,否则将返回false,因此在哈希图中会检查内容是否相同?如果内容相同,则第一个替换为第二个,如果两个内容都不相同,它将在框内创建另一个对象并存储数据
答案 3 :(得分:0)
哈希集:-基本上,哈希集用于一次存储一堆对象,内部哈希集也仅使用哈希映射,当我们在内部使用add方法插入某种想法时,它将调用put方法并将其存储在hashmap key bcz hash map key始终是唯一和重复的,这是不允许hashset也是唯一和重复的方式,如果我们也在hashst中输入重复,则第一个将不会出现任何异常,它将替换为第二个,并且值它将存储常量数据“ PRESENT”。
您可以看到内部哈希图对象包含哈希集元素作为键,并包含常量“ PRESENT”作为其值。 存在的地方是常数,定义为 私有静态最终对象存在= new Object()