首页 > 其他 > 详细

2.3 HashSet,LinkedHashSet,TreeSet

时间:2020-06-16 11:59:15      阅读:47      评论:0      收藏:0      [点我收藏+]

一、HashSet

private transient HashMap<E,Object> map; //map集合,HashSet存放元素的容器 private static final Object PRESENT = new Object(); //map,中键对应的value值
HashSet是Set接口的典型实现,HashSet按照Hash算法来存储集合中的元素。存在以下特点:
  • 不能保证元素的顺序,元素是无序的
  • HashSet不是同步的,需要外部保持线程之间的同步问题
  • 集合元素值允许为null
 
PRESENT为HashSet类中定义的一个使用static final 修饰的常量,并无实际的意义,HashSet的add方法调用HashMap的put()方法实现,如果键已经存在,map.put()放回的是旧值,添加失败,如果添加成功map.put()方法返回的是null ,HashSet.add()方法返回true,要添加的元素可作为map中的key 。
 
对于Hashset而言,它所有的key对应的值都是PRESENT。
 
  • HashSet的底层通过HashMap实现的。而HashMap在1.7之前使用的是数组+链表实现,在1.8+使用的数组+链表+红黑树实现。其实也可以这样理解,HashSet的底层实现和HashMap使用的是相同的方式,因为Map是无序的,因此HashSet也无法保证顺序。
  • HashSet的方法,也是借助HashMap的方法来实现的。
 
二、LinkedHashSet 
LinkedHashSet是HashSet的子类。
相同点:
两者都不能保存重复的数据。
差异点:
1、HashSet不保证集合中元素的顺序(因为用的HashMap保存数据),即不能保证迭代的顺序与插入的顺序一致。
2、LinkedHashSet按照元素插入的顺序进行迭代(因为用的LinkedHashMap保存数据),即迭代输出的顺序与插入的顺序保持一致
 
调用HashSet的构造器,map = new LinkedHashMap<>(initialCapacity, loadFactor);
 
所有操作基于map
例:add 内部为map.add();
 
 
三、TreeSet
TreeSet的元素支持2种排序方式:自然排序或者根据提供的Comparator进行排序。
1、不能有重复的元素;
2、具有排序功能;
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法;
①对于Java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等,因为这些类已经实现了Comparable接口);
②对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,否则无法判断是否重复。
4、依赖TreeMap。
5、相对HashSet,TreeSet的优势是有序,劣势是相对读取慢。根据不同的场景选择不同的集合。
 

2.3 HashSet,LinkedHashSet,TreeSet

原文:https://www.cnblogs.com/zhaosong-0102/p/13139869.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!