• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

HasmMap和HashSet有什么区别

HasmMap和HashSet的区别是:1. HashSet实现了Set接口, 仅存储对象; HashMap实现了 Map接口, 存储的是键值对;2. HashSet底层其实是用HashMap实现存储的,HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值。

一、HasmMap和HashSet的区别

1.HashSet实现了Set接口, 仅存储对象; HashMap实现了 Map接口, 存储的是键值对.

2.HashSet底层其实是用HashMap实现存储的, HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值,(利用hashMap的key键进行存储), 而value值默认为Object对象. 所以HashSet也不允许出现重复值, 判断标准和HashMap判断标准相同, 两个元素的hashCode相等并且通过equals()方法返回true。

HashSet 集合不允许存储相同的元素, 它底层实际上使用 HashMap 来存储元素的, 不过关注的只是key元素, 所有 value元素默认为 Object类对象。

HashSet 的构造方法

//HashSet底层用来存储元素的结构,实际上使用HashMap来存储

private transient HashMap<E,Object> map;

//HashMap中的value值,HashSet只关注key值,所以所有的value值都为Object对象

private static final Object PRESENT = new Object();

//HashSet的无参构造,直接创建了一个HashMap对象

public HashSet() {

        map = new HashMap<>();

}

//指定初始化容量和负载因子

public HashSet(int initialCapacity, float loadFactor) {

        map = new HashMap<>(initialCapacity, loadFactor);

}

//给定初始化容量

public HashSet(int initialCapacity) {

        map = new HashMap<>(initialCapacity);

}

public HashSet(Collection<? extends E> c) {

        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

        addAll(c);

}

可以看到 HashSet的构造方法底层都是调用 HashMap的构造方法, 所以HashSet底层实际上是使用 HashMap 来作为存储结构.

当使用无参构造创建 HashSet对象时, 其实调用了 HashMap的无参构造创建了一个 HashMap对象, 所以 HashSet 的初始化容量也为16, 负载因子也为 0.75.

HashSet 的 add() 方法的实现

可以看到 HashSet 的 add() 方法底层实际也是调用了 HashMap 的 put() 方法, 这里的key为我们传入的将要添加到 set集合中的元素, 而value值则为 PERSENT,其实就是上面分析的 HashSet类中的一个静态字段, 默认为 Object对象.

HashSet并不关注value元素, 只使用 HashMap来存储 key元素, 这就使得 HashSet判断元素相等的条件与 HashMap中 key相等的条件其实是一样的, 两个元素的 hashCode值相同且通过equals()方法比较返回 true.

所以HashSet应该重写 equals()和hashCode()方法, 两个元素的 HashCode相同, 保证通过equals() 方法比较返回 true

延伸阅读:

二、HashMap介绍

HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现

TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null))

HashMap是非线程安全的(非Synchronize),要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

以上就是关于HasmMap和HashSet有什么区别的内容希望对大家有帮助。

相关文章