Set用于存储无序(存入和读取的顺序不一定个相同)的元素,而且不重复存储元素。
在该set中我们常常用到的是HashSet、TreeSet、LinkedHashSet。
HashSet
HashSet是线程不安全的,存取速度快,底层是一哈希表实现的。
哈希表变存放的是哈希值,HashSet存储元素的顺序并不是按照存入时的顺序,而是按照哈希值来存的,取数据的时候也是按照哈希值来取。HashSet判断存入重复元素的规则,使用的是hashcode和equals来判断的。
在对象加入HashSet之前,HashSet会调用对象的hashCode方法来判断对象加入的位置,同时也会与其他已经加入的对象的hashCode进行比较,如果没有相等的hashCode,HashSet就会认为对象没有重复出现。如果哈希值相同,接着会焦勇equals方法,如果equals返回为true,那么HashSet会认为对象重复出现了,加入失败,如果返回false,HashSet认为新加入的对象没有重复,新元素可以存入。
流程图
TreeSet
如果数据要求不能重复存储元素,而且要排序,那么此时可以使用TreeSet
TreeSet是采用的红-黑树的数据结构,默认对元素进行自然排序。如果在比较的时候两个对象返回值为0,那么元素重复。
当然,我们也可以给TreeSet指定排序规则
指定排序规范的方式
一、元素自身具备比较行
元素自身具备比较性,需要元素实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序
二、容器具备比较性
当元素自身不具备比较性,或者自身具备的比较性不是所需要的,那么此时可以让容器自身具备。定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeSet集合的构造方法。
注:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主。
LinkedHashSet
如果需要保存存储数据,并且需要过滤重复元素,可以使用LinkedHashSet。
相关用法,可参考API文档。