是一个特殊的map;不允许元素重复,因为存入到了map的键上,
而map的键是不能重复的,其实现类
HashSet无序,
TreeSet有序
会按照数字将元素排列,为“可排序集合”。要保证被装入Set的元素
不会重复,需要元素的类型正确实现hashCode方法;
set没有get和size方法,所以遍历set集合只能使用迭代器iterator
==========================================
* 用哈希算法存放单个数据
* 内部使用 HashMap 的键存放数据
内部封装了一个HashMap
数据存在HashMap的键的位置
* 作为HashMap的键存储,所以不重复
* 根据哈希值算出来的,所以无序
(这个无序指的是数据的添加顺序和后来的排列顺序不同)
所以保存的数据无序并且唯一
创建对象
-----------------------------
HashSet set = new HashSet();
方法
-----------------------------
add(数据)
remove(数据)
size()
iterator() 获得迭代器实例
contains(数据)
clear()
HashSet vs HashMap
如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录。
Key值既然可以作为对象,那么也可以用一个自定义的类。比如:
m.put(new sutdent(“Liucy”,30),”boss”)
如果没有语句来判定Student类对象是否相同,则会全部打印出来。
当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。
注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性)。HashSet实际上为(key.null)有键无值的HashMap。有key值而没有value值。正因为以上的原因,TreeSet和TreeMap的实现也有些类似的关系。
注意:TreeSet和TreeMap非常的消耗时间,因此很少使用。我们应该熟悉各种实现类的选择——非常体现你的功底。
======================================
* 内部使用 TreeMap 的键存放数据
* 作为TreeMap的键存储数据,所以不重复
* 有序,从小到大,所以能对内部因素排序
SortedSet的实现类TreeSet自动为添加到TreeSet中的元素排序
与HashSet不同,TreeSet并不需要实现HashCode()和equals()
只要实现compareable接口并重写其compareTo()就可以排序
(注:HashSet不调用CompareTo())
如果要查询集合中的数据,使用Set必须全部遍历,所以查询的效率低
创建对象
-----------------------------------
1. TreeSet set = new TreeSet();
2. TreeSet set = new TreeSet(比较器对象);
方法
-----------------------------------
与 HashSet 相同的方法
HashSet VS TreeSet:
HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用,而且最好不要重复使用。基于以上原因,我们尽可能的运用HashSet而不用TreeSet,除非必须排序。
(能够保证元素的添加顺序):底层借助LinkedHashMap存储(哈希表)