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

原文出处:https://blog.csdn.net/bestxiaok/article/details/78413022

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()等方法;代码例子如下:

先定义一个实体类

 
  1. class Apple implements Comparable<Apple>{

  2.  
  3. int size;

  4.  
  5. public Apple(int s) {

  6.  
  7. size = s;

  8.  
  9. }

  10.  
  11. public String toString() {

  12.  
  13. return size + "";

  14.  
  15. }

  16.  
  17. @Override

  18.  
  19. public int compareTo(Apple o) {

  20.  
  21. return size - o.size;

  22.  
  23. }

  24.  
  25. }

  26.  
  27. HashSet dset = new HashSet();

  28.  
  29. dset.add(new Apple(8));

  30.  
  31. dset.add(new Apple(1));

  32.  
  33. dset.add(new Apple(6));

  34.  
  35. dset.add(new Apple(7));

  36.  
  37. dset.add(new Apple(2));

  38.  
  39. Iterator iterator = dset.iterator();

  40.  
  41. while (iterator.hasNext()) {

  42.  
  43. System.out.print(iterator.next() + " ");

  44.  
  45. }

 

执行后输出:

8 6 2 1 7

可以看到这是没有顺序的。

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

 

 
  1. reeSet tree = new TreeSet();

  2.  
  3. tree.add(28);

  4.  
  5. tree.add(58);

  6.  
  7. tree.add(38);

  8.  
  9. tree.add(18);

  10.  
  11. Iterator iterator = tree.iterator();

  12.  
  13. System.out.print("排序后的数据显示: ");

  14.  
  15. while (iterator.hasNext()) {

  16.  
  17. System.out.print(iterator.next() + " ");

  18.  
  19. }

 

执行后输出如下:

排序后的数据显示: 18 28 38 58

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

 
  1. LinkedHashSet dset = new LinkedHashSet();

  2.  
  3. dset.add(new Apple(7));

  4.  
  5. dset.add(new Apple(6));

  6.  
  7. dset.add(new Apple(8));

  8.  
  9. dset.add(new Apple(10));

  10.  
  11. dset.add(new Apple(9));

  12.  
  13. Iterator iterator = dset.iterator();

  14.  
  15. while (iterator.hasNext()) {

  16.  
  17. System.out.print(iterator.next() + " ");

  18.  
  19. }

  20.  


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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值