到处都可以找到答案的差异:
映射存储键值,它不同步(不是线程安全),允许空值和只有一个空键,更快获得值,因为所有值都有唯一键等。 设置 - 未排序,获取值较慢,仅存储值,不允许重复或空值。
但是什么意思是哈希词(就是他们有相同的东西)。它是关于散列值的东西还是我希望你能清楚回答我的东西。
答案 0 :(得分:2)
两者都使用Object的哈希值来存储哪些内部使用Object类的hashCode();
方法。
因此,如果要存储自定义类的实例,则需要覆盖hashCode();
方法。
答案 1 :(得分:1)
HashSet就像一个HashMap,你不关心值,而只关心键。
因此,只有当给定的密钥K在集合中而不是它所映射的值V时才关心(您可以将其视为V是常量,例如对于HashSet中的所有密钥,V = Boolean.TRUE)。所以HashSet没有值(V set)。这与结构观点完全不同。散列部分意味着当将元素放入结构时,Java首先调用hashCode方法。另请参阅http://en.wikipedia.org/wiki/Open_addressing以了解一般情况下会发生什么
如果两个对象相同,则哈希值用于更快地检查。如果两个对象具有相同的散列,则它们可以相等或不相等(因此它们将与equals方法进行相等性比较)。但如果他们有不同的哈希,他们肯定是不同的,不需要检查平等。这并不意味着如果两个对象具有相同的哈希值,则当它们存储在HashSet或HashMap中时,它们会相互覆盖。
答案 2 :(得分:1)
HashSet
和HashMap
有许多共同点:
hashCode
方法)来快速处理和组织对象。LinkedHashX
以按添加顺序存储对象)TreeSet
/ TreeMap
来对集合中存在的所有对象进行排序并对其进行排序。 TreeSet与TreeMap的比较将发现与HashSet和HashMap之间的差异和相似之处非常相似。它们也受到哈希算法的优势和局限性的影响。
equals
和hashCode
没有遵循正确的合同,则哈希完全中断。hashCode
和equals
返回值永远不会改变),否则行为将变为未定义。如果您查看Map API,您还可以看到许多其他有趣的连接 - 例如keySet
和entrySet
都返回Set
这一事实。
所有Java集合都不是线程安全的。其他包中的一些较旧的类是,但他们大多数已经退休。有关线程安全性,请查看concurrent
包以获取非线程安全性查看collections
包。
答案 3 :(得分:1)
只需查看HashSet
source code,您就会看到它使用HashMap
。因此它们具有与null安全性,同步等相同的属性:
public class HashSet<E>
...
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
...
public boolean contains(Object o) {
return map.containsKey(o);
}
...
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
...
}
答案 4 :(得分:0)
两者都不是Thread
安全的,并使用hashCode()
存储值。这是常见的事实。另一个是Java集合框架的成员。但这两者之间存在很多差异。
答案 5 :(得分:0)
Hash认为用于将密钥转换为索引的技术。回到数据结构类中,我们习惯学习如何构造哈希表,为此,您需要获取作为值插入的字符串,并将它们转换为数字,以索引内部使用的数组作为存储数据结构。
一个也被讨论过的问题是找到一个最小切割时会产生的散列函数,这样我们就不会有两个不同的对象,不同的键共享相同的位置。
因此,哈希是关于如何处理密钥的存储方式。如果我们考虑它一段时间,没有(真正的)方法用字符串索引内存,只有数字,所以有一个2d结构就像一个由字符串索引的表(或你想要的对象) )您需要为该字符串生成一个数字(或哈希),并将该值存储在此索引的数组中。但是,如果您需要密钥“name”,则需要使用不同的数组,在同一索引中存储密钥“name”。
干杯
答案 6 :(得分:0)
“HASH”这个词很常见,因为它们都使用散列机制。 HashSet实际上是使用HashMap实现的,在Set的每个条目上使用虚拟对象实例。因此每个条目的浪费为4个字节。