前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

作者头像
二哥聊运营工具
发布2021-12-17 08:08:26
2100
发布2021-12-17 08:08:26
举报
文章被收录于专栏:程序员泥瓦匠

摘要: 原创出处 www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

上一篇总结了下《ArrayList 、LinkedList 和 Vector 比较》,今天泥瓦匠总结下 HashSet 、LinkedHashSet 和 TreeSet 比较。其实大家都是 Collection ,只不过有点各自特性。那就是数据结构的不同表现。

一、Set 回顾

一个不包括重复元素(包括可变对象)的 Collection,是一种无序的集合。Set 不包含 a.equals(b) 的元素对 a 和 b,并且最多有一个 NULL。

泥瓦匠的记忆宫殿: 1、不允许包含相同元素

2、判断对象是否相同,根据 equals 方法

二、HashSet

一个按着 Hash 算法来存储集合中的元素,其元素值可以是 NULL。它不能保证元素的排列顺序。同样,HashSet 是不同步的,如果需要多线程访问它的话,可以用 Collections.synchronizedSet 方法来包装它:

同上一节一样,用迭代器的时候,也要注意 并发修改异常 ConcurrentModificationException。

要注意的地方是,HashSet集合判断两个元素相等不单单是equals方法,并且必须hashCode()方法返回值也要相等。看下面的例子:

Run 一下,控制台如下输出:

泥瓦匠根据结果,一一到来。首先,排列顺序不定。

HashSetObj 类满足我们刚刚的要求,所以集合中只有一个且它的HashCode值为2。

HashCodeObj 类虽然它们HashCode值为 1,但是他们不相等。(其实当HashCode 值一样,这个存储位置会采用链式结构保存两个 HashCodeObj 对象。)

同样,EqualsObj 类他们相等,但是他们 HashCode 值不等,分别为1471cb25、3acff49f。

因此,用 HashSet 添加可变对象,要注意当对象有可能修改后和其他对象矛盾,这样我们无法从 HashSet 找到准确我们需要的对象。

三、LinkedHashList

HashSet 的子类,也同样有 HashCode 值来决定元素位置。但是它使用链表维护元素的次序。记住两个字:有序。

有序的妙用,复制。比如泥瓦匠实现一个 HashSet 无序添加,然后复制一个一样次序的 HashSet 来。代码如下:

Run 一下,控制台输出:

可见,每个数据结构都有它存在的理由。

四、TreeSet

TreeSet 使用树结构实现(红黑树),集合中的元素进行排序,但是添加、删除和包含的算法复杂度为 O(log(n))。

举个例子吧,首先我们定义一个 Bird 类:(鸟是泥瓦匠最喜欢的动物)

然后用TreeSet添加Bird类:

Run 一下,控制台输出如下:

答案很明显,TreeSet 是排序的。所以 Bird 需要实现 Comparable 接口。

java.lang.Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

修改Bird如下:

再次Run一下:

五、性能测试比较

针对上面三种 Set 集合,我们对它们的 Add 方法进行性能测试:

Run一下,可以在控制台中看出:

可见,TreeSet 因为需要进行比较,所以性能比较差。

六、总结

HashSet:equlas hashcode

LinkedHashSet:链式结构

TreeSet:比较,Comparable 接口,性能较差

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈。你也可以分享到朋友圈哦,让更多的人阅读这篇文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员泥瓦匠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Set 回顾
  • 三、LinkedHashList
  • 四、TreeSet
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档