什么是Set数据结构
- Set相对于List是简单的一种集合,具有和Collection完全一样的接口,只是实现接口不同,Set不保存重复的元素,存储一组唯一,无序的对象
- Set中的元素是不重复的,实现细节可以看Map,因为这些Set的实现都是对应的Map的一种封装。比如HashSet是对HashMap的封装,TreeSet对应TreeMap
- Set底层是一个HashMap,由于HashMap的put()方法是一个键值对,当新放入HashMap的Entry中key与集合原有Entry的key相同(hashCode()返回值相同,通过equals比较也返回true),新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变
- 允许包含值为null的元素,但最多只能有一个null元素
常见的实现类
- HashSet
- HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
- 对应的Map是hashMap,是基于Hash的快速元素插入,元素无顺序
- TreeSet
- TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序
//创建对象,HashSet和TreeSet api⼀样
Set<Integer> set = new HashSet<>();
//往容器⾥⾯添加对象
set.add("jack");
//清空元素
set.clear();
//返回⼤⼩
set.size();
//根据对象删除元素
set.remove("jack");
//是否为空
set.isEmpty();
两则区别
- HashSet不能保证元素的排列顺序,TreeSet是SortedSet接口的唯一实现类,可以确保集合元素处于排序状态
- HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树(红黑树是一种特定类型的二叉树)
- HashSet中元素可以是Null,但只能有一个,TreeSet不允许放入Null
- 一般使用HashSet,如果需要排序的功能时,才使用TreeSet(插入、删除、修改性能慢)