Java中三种Set类型用法、性能大比拼

Java为开发者提供了大量的工具类,这给开发人员带来了很大方便,但是选择多了也有困扰,究竟用哪个类;我想选择什么,一是看自己具体需求,二是类本身的性能和用法;Java中提供了HashSet、TreeSet、LinkedHashSet三种常用的Set实现,以下具体分析它们的用法和性能。

网络配图 我们使用Set的原因是Set集合不包含重复元素,HashSet、TreeSet和LinkedHashSet三种类型什么时候使用它们,使用哪个这是一个很重要的选择性问题,正确的选择会大大提升程序运行效率;总结一下,如你的需求是要一个能快速访问的Set,那么就要用HashSet,如果你要一个排序Set,那么你应该用TreeSet,如果你要记录下插入时的顺序时,你应该使用LinedHashSet。把握这几个原则,是不是选择起来就简单多了。 Set接口的特性,Set接口继承了Collection接口,Set集合中不能包含重复的元素,每个元素必须是唯一的,你只要将元素加入set中,重复的元素会自动移除。下面分三方面对它的三个实现类进行说明。 1、HashSet类:HashSet是采用hash表算法来实现的,其中的元素没有按顺序排列,主要有add()、remove()以及contains()等方法;代码例子如下: 先定义一个实体类

class Apple implements Comparable<Apple>{
int size;
public Apple(int s) {
size = s;
}
public String toString() {
return size + "";
}
@Override
public int compareTo(Apple o) {
return size - o.size;
}
}
HashSet dset = new HashSet();
dset.add(new Apple(8));
dset.add(new Apple(1));
dset.add(new Apple(6));
dset.add(new Apple(7));
dset.add(new Apple(2));
Iterator iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

执行后输出: 8 6 2 1 7 可以看到这是没有顺序的。

网络配图 2、TreeSet类:TreeSet是采用树结构实现(称为红黑树算法),元素是按顺序进行排列,主要有add()、remove()以及contains()等方法,它们都是复杂度为O(log (n))的方法;它还提供了一些处理排序的set方法,如first(), last(), headSet(), tailSet()等。代码例子如下:

TreeSet tree = new TreeSet();
tree.add(28);
tree.add(58);
tree.add(38);
tree.add(18);
Iterator iterator = tree.iterator();
System.out.print("排序后的数据显示: ");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

执行后输出如下: 排序后的数据显示: 18 28 38 58 3、LinkedHashSet类:LinkedHashSet正好介于HashSet和TreeSet之间,它也是一个hash表,但它同时维护了一个双链表来记录插入的顺序,基本方法的复杂度为O(1)。代码例子如下:

LinkedHashSet dset = new LinkedHashSet();
dset.add(new Apple(7));
dset.add(new Apple(6));
dset.add(new Apple(8));
dset.add(new Apple(10));
dset.add(new Apple(9));
Iterator iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

执行输出:7 6 8 10 9 输出的顺序和插入的顺序是一样的。

网络配图 总之,它们各有优缺点,选择用什么,看自己需求,不过要说明一点HashSet速度是最快的;好了,今天学习到这里,明天见!

原文发布于微信公众号 - Java学习网(javalearns)

原文发表时间:2017-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮皮之路

【JDK1.8】JDK1.8集合源码阅读——Set汇总

11730
来自专栏codingforever

经典算法巡礼(七) -- 排序之堆排序

很多时候,我们需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。比如你可能启动了若干个定时器,那么下一次处理定时器事件只需要考虑距离现...

8120
来自专栏阿杜的世界

Java并发-CopyOnWriteArrayList前言CopyOnWriteArrayList API例子1:插入(删除)数据的同时进行遍历例子2:不支持一边遍历一边删除结论参考资料

今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类。当有多个线程可能同时遍历、修改某个公共数组时...

16030
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

22860
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高十九】Iterator&fail-fast机制

【Java提高十九】Iterator&fail-fast机制 Iterator详解 迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行...

415110
来自专栏java思维导图

【一分钟知识】HashSet和TreeSet,HashMap与HashTable

java思维导图 xmind导图配合精美文章,可视化学习,让java不再难懂。 ? ? HashSet和TreeSet HashSet 哈希表实现的,HashS...

37370
来自专栏落花落雨不落叶

leetcode 34. Search for a Range

31160
来自专栏王磊的博客

Java核心(四)面试必备—你不知道的数据集合

导读:Map竟然不属于Java集合框架的子集?队列也和List一样属于集合的三大子集之一?更有队列的正确使用姿势,一起来看吧!

11220
来自专栏Java工程师日常干货

对HashMap的思考及手写实现前言对HashMap的思考通过写一个迷你版的HashMap来深刻理解

HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设...

10420
来自专栏一个会写诗的程序员的博客

FastJson中@JSONField注解使用FastJson中@JSONField注解使用

如果json格式数据不符合Java中的标准驼峰式变量定义规则,并且难以理解,这个时候就需要在后台中做二次处理,将数据处理成我们系统中定义的格式。

18230

扫码关注云+社区

领取腾讯云代金券