HashMap 和 HashSet区别

HashMap 和 HashSet 都是在 Java 中使用的基于哈希表的数据结构,但是它们有着不同的用途和特性:

HashMap
存储键值对:HashMap 存储的是键(key) - 值(value) 对。每个键只能映射到至多一个值,并且不允许有相同的键存在(即key唯一),但可以有不同的键指向同一个value。
元素有序性:自 JDK 1.7 后,默认情况下插入顺序不保证保留;但在遍历时会按照链表节点的位置进行访问,在大多数场景下接近于随机排列。(JDK1.8之后引入了红黑树优化)
允许null:它允许一条记录的 key 或 value 可以为 null, 即可以有一个 null 键和多个 null 的值。
HashSet
仅存单一对象:HashSet 内部实际上使用了一个 HashMap 来实现,其中将传入的对象作为map中的Key,而所有 Value 固定设置为默认存在的 Present 类型实例(实际上是 static final Object PRESENT = new Object()) 。因此其只保存单独的对象而不涉及关联另一个数据项的问题.
无序集合:同样由于内部依赖于 hashMap 实现,所以 set 元素也是非排序、非重复的;
不允许null :对于 hashSet 而言只能包含一个 null 元素因为它是依据对象 hashCode() 方法计算散列码来判断两个元素是否相等,当有两个以上null的时候无法区分它们之间的差异.
总结来说,如果你需要维护一组独一无二的项目并且不需要考虑他们与其他信息的关系,则应该选择 HashSet; 如果你需要追踪更多关于某个项目的额外资料比如计数或者其他属性,那么此时更适合选用 HashMap。

你可能感兴趣的:(java,开发语言)