HashSet 和 HashMap 在 Java 中是如何工作的?
How do HashSet and HashMap work in Java?
我对 java 中 HashSet
和 HashMap
的内部实现有点困惑。
这是我的理解,如有错误请指正:
HashSet
或 HashMap
均不允许重复元素。
HashSet
由 HashMap
支持,因此在 HashSet
中,当我们调用 .add(element)
时,我们是在元素上调用 hashCode()
方法并在内部对内部 HashMap
执行 put(k,v)
,其中键是 hashCode
,值是实际对象。因此,如果我们尝试将相同的对象添加到 Set
,它会看到 hashCode
已经存在,然后用新值替换旧值。
但是,当我读到 HashMap
在将我们自己的对象作为键存储在 HashMap
中时如何工作时,这对我来说似乎不一致。
在这种情况下,我们必须覆盖 hashCode()
和 equals()
方法并使它们彼此一致,因为如果我们找到具有相同 hashCode
的键,它们将进入同一个桶,然后为了区分具有相同 hashCode
的所有条目,我们必须遍历条目列表以在每个键上调用方法 equals()
并找到匹配项。
因此,在这种情况下,我们允许具有相同的 hashCode
,并且我们创建一个存储桶,其中包含具有相同 hashCode
的所有对象的列表,但是使用 HashSet
,如果我们已经找到a hashCode
,我们用新值替换旧值。
我有点困惑,有人可以给我解释一下吗?
关于 HashMap
的行为是正确的,但是关于 HashSet
的实施是错误的。
HashSet
在内部由 HashMap
支持,但是您添加到 HashSet
的元素用作支持 HashMap
中的键。对于该值,使用虚拟值。因此 HashSet
的 contains(element)
只是调用支持 HashMap
的 containsKey(element)
.
我们在 HashMap 中 插入 的值充当映射对象的键,对于它的值,java 使用 常量变量。因此在键值对中,所有键将具有相同的值 .
你可以参考这个link
https://www.geeksforgeeks.org/hashset-in-java/
哈希映射:- 基本上哈希映射作为键和值工作,如果我们想将数据存储为键和值对,那么我们将转到哈希映射,基本上当我们基本上在内部使用哈希映射插入数据时会跟着3想,
1.hashcode
2..等于
3.==
当我们在 hash map 中插入数据时,它会使用 hash code 将数据存储在 bucket(fast in) 中,如果在同一个 bocket 中有 2 个数据存储,那么 key collision 会碰巧解决这个键冲突我们使用 (==) 方法,总是 == 方法检查对象的引用,如果两个对象哈希码相同则第一个替换为第二个如果哈希码不相同则 hashing Collision 会碰巧解决这个 hashing 冲突我们将使用 (.equal) 方法。equal 方法基本上它会检查内容,如果两个内容相同那么它会 return true否则它会 return false,所以在哈希映射中它会检查内容是否相同?如果内容相同,则第一个替换为第二个,如果两个内容不同,它将在 bocket 中创建另一个对象并存储数据
Hash Set:- 基本上Hash Set一次用来存储一堆对象,内部hash set也只使用hash map,当我们在内部使用add方法插入somethink时,它会调用put方法并存储hashmap 键 bcz 中的数据 hash map key 始终是唯一的,不允许重复这样 hashset 也是唯一的和重复的是不允许的,如果我们也在 hashst 中输入重复的,它不会通过任何异常第一个将替换为第二个并且在它将存储常量数据的值 "PRESENT".
你可以观察到内部hashmap对象包含hashset的元素作为键,常量“PRESENT”作为它们的值。
其中 present 是常数,定义为
private static final Object present = new Object()
我对 java 中 HashSet
和 HashMap
的内部实现有点困惑。
这是我的理解,如有错误请指正:
HashSet
或 HashMap
均不允许重复元素。
HashSet
由 HashMap
支持,因此在 HashSet
中,当我们调用 .add(element)
时,我们是在元素上调用 hashCode()
方法并在内部对内部 HashMap
执行 put(k,v)
,其中键是 hashCode
,值是实际对象。因此,如果我们尝试将相同的对象添加到 Set
,它会看到 hashCode
已经存在,然后用新值替换旧值。
但是,当我读到 HashMap
在将我们自己的对象作为键存储在 HashMap
中时如何工作时,这对我来说似乎不一致。
在这种情况下,我们必须覆盖 hashCode()
和 equals()
方法并使它们彼此一致,因为如果我们找到具有相同 hashCode
的键,它们将进入同一个桶,然后为了区分具有相同 hashCode
的所有条目,我们必须遍历条目列表以在每个键上调用方法 equals()
并找到匹配项。
因此,在这种情况下,我们允许具有相同的 hashCode
,并且我们创建一个存储桶,其中包含具有相同 hashCode
的所有对象的列表,但是使用 HashSet
,如果我们已经找到a hashCode
,我们用新值替换旧值。
我有点困惑,有人可以给我解释一下吗?
关于 HashMap
的行为是正确的,但是关于 HashSet
的实施是错误的。
HashSet
在内部由 HashMap
支持,但是您添加到 HashSet
的元素用作支持 HashMap
中的键。对于该值,使用虚拟值。因此 HashSet
的 contains(element)
只是调用支持 HashMap
的 containsKey(element)
.
我们在 HashMap 中 插入 的值充当映射对象的键,对于它的值,java 使用 常量变量。因此在键值对中,所有键将具有相同的值 .
你可以参考这个link https://www.geeksforgeeks.org/hashset-in-java/
哈希映射:- 基本上哈希映射作为键和值工作,如果我们想将数据存储为键和值对,那么我们将转到哈希映射,基本上当我们基本上在内部使用哈希映射插入数据时会跟着3想, 1.hashcode 2..等于 3.==
当我们在 hash map 中插入数据时,它会使用 hash code 将数据存储在 bucket(fast in) 中,如果在同一个 bocket 中有 2 个数据存储,那么 key collision 会碰巧解决这个键冲突我们使用 (==) 方法,总是 == 方法检查对象的引用,如果两个对象哈希码相同则第一个替换为第二个如果哈希码不相同则 hashing Collision 会碰巧解决这个 hashing 冲突我们将使用 (.equal) 方法。equal 方法基本上它会检查内容,如果两个内容相同那么它会 return true否则它会 return false,所以在哈希映射中它会检查内容是否相同?如果内容相同,则第一个替换为第二个,如果两个内容不同,它将在 bocket 中创建另一个对象并存储数据
Hash Set:- 基本上Hash Set一次用来存储一堆对象,内部hash set也只使用hash map,当我们在内部使用add方法插入somethink时,它会调用put方法并存储hashmap 键 bcz 中的数据 hash map key 始终是唯一的,不允许重复这样 hashset 也是唯一的和重复的是不允许的,如果我们也在 hashst 中输入重复的,它不会通过任何异常第一个将替换为第二个并且在它将存储常量数据的值 "PRESENT".
你可以观察到内部hashmap对象包含hashset的元素作为键,常量“PRESENT”作为它们的值。 其中 present 是常数,定义为 private static final Object present = new Object()