java.util.HashSet为什么要用Map来实现?每次put中还要装进一个假value值,不是占空间吗?

java.util.HashSet为什么要用Map来实现?每次put中还要装进一个假value值,不是占空间吗?
请勿灌水

你可以看一下源码,在源码里 hashset put 的每一个 entry 里,值是一个名为 PRESENT 的 object,它是 static final 的,也就是说所有的 entry 的值都是一个相同的 object 引用,所以不会占用太多空间。

至于为什么要用 map 来实现 set,可能是因为 map 和 set 比较接近,都是 key 值不能相同。这样做可以减少代码的重复,方便维护。

参考1:网页链接

参考2:网页链接

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-20
属于三个类别中的,也就是List,Set,Map。

List与Set都是放单独的对象的,Map则是放一个名值对,就是可以通过一个key找到一个value。

List存东西是有顺序的,Set是没有顺序的。

List是允许重复存入的,Set不可以。

ArrayList,看这名字,你可以把它当个数组,数组你知道吧,大小是固定的,所以它的特点是查找快(数组里都有下标值),可是插入和移除却很慢

LinkedList,你可以把它当做个链表,它的特点是插入很容易,查找特别慢(至于为什么自己去看看链表吧)

HashSet,用了hash嘛~查找更快了~

TreeSet,这个是自动排序的。

至于HashMap和TreeMap,和Set的差不多,HashMap查找快,TreeMap自动排序。

说说重写。

为什么要重写equals?当然是判断两个元素是否相等了,这个时候就要重写equals了,别忘了重写hashcode

compareTo是用来比较的,大部分都是用来排序的,所以当你有这种需求的时候就去重写compareTo吧。

我大概就说这么多,若是有什么不对的,大家帮忙指出纠正~本回答被网友采纳
第2个回答  2011-04-20
HashSet没有用map来实现,hashset和map所继承的接口是不一样的,hashset继承的collection接口而不是map接口,hashset的元素排序方式只是和hashmap的key一样采用了散列法,但这并不意味着hash有一个假的value值,事实上,hashset不存在这个所谓的假的value值。
第3个回答  2011-04-20
这不是让费空间的问题的,一个key对应一个value,查找起来也方便啊,通过value = map.get(key),获取值方便啊,如果使用集合什么的就需要通过遍历的方式不是很麻烦吗?至于你那假value不知道你说的什么意思
上述尽是个人使用的一些看法