java - HashMap和HashSet的区别
你可以先百度一下 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条不知道是怎么得出的,肯定不对。
你如果就是想知道一下他们的区别,记得百度之后甄别一下对错,挑选出正确的记下就是了。
但是我建议你记住以下一条就对了:
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。
可以睡觉了...
版权声明
本文仅代表作者观点,不代表博信信息网立场。