意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

java - HashMap和HashSet的区别_个人文章

来源:恒创科技 编辑:恒创科技编辑部
2024-01-30 13:39:59

你可以先百度一下 HashMap和HashSet的区别,有很多答案,包括但不限于:

HashMap实现了Map接口,HashSet实现了Set接口。HashMap是保存key/value的集合,HashSet是保存对象的结合。HashMap不允许重复的键,但是允许重复的值,HashSet不允许重复的元素。HashMap允许有一个键为空,多个值为空,HashSet允许有一个空值。HashMap中使用put()将元素加入map中,而HashSet使用add()将元素放入set中。HashSet较HashMap来说比较慢。

可能还有其他的......

以上1~5应该是对的,第6条不知道是怎么得出的,肯定不对。


java - HashMap和HashSet的区别_个人文章

你如果就是想知道一下他们的区别,记得百度之后甄别一下对错,挑选出正确的记下就是了。

但是我建议你记住以下一条就对了:

HashSet底层其实就是HashMap,HashSet除了封装之后暴露出来的方法和HashMap不同之外(比如add方法和put方法的区别),其实没有什么鸟区别!

不信你就看看HashSet源码:

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<>();
}

仔细看一眼(说错了,简单看一眼),你就会发现:

HashSet数据其实存储在成员变量map中,map就是个HashMap。HashSet包含了一个叫 dummy value的object对象,创建HashSet的时候为每一个key匹配这个dummy object生成HashMap,所以说白了,你可以理解为:HashSet其实就是为所有key值都默认匹配一个空的Object对象的HashMap。HashSet的add方法,调用的是HashMap的put方法。不止,Hashset的contains()、size()、isEmpty()、iterator()...等等一众方法,调用的都是HashMap对应的方法。

所以你说他们两个有什么区别?从底层数据结构的角度看,他们其实就是同一头驴子,在不同的场合给他一个不同的披挂,拉出来遛而已。只不过在某些场合他的某些功能被限制了不让用,而已。

所以,其实我们可以这么看待HashSet:

HashSet底层就是HashMap。这一点很重要,我们就不再需要分析Hashset的底层数据结构了。HashSet只允许存储元素而不允许存储键值对。HashSet可以通过add增加元素,通过contains判断元素是否存在。由于HashMap不允许重复的键,所以可以得出,HashSet不允许存储重复的元素。Hashset允许存储唯一的一个Null对象。

不啰嗦了,HashSet的几乎所有特性都可以由HashMap推导出来。

此外,省点力气:LinkedHashSet对应LinkedHashMap,TreeSet对应TreeMap。

可以睡觉了...

上一篇: java - 线程的创建_个人文章 下一篇: 手机怎么远程登录云服务器?