Set接口
Set集合类似于一个罐子,丢进去的元素没有明显的顺序,所以我们如果要访问Set中的元素的时候就只能通过元素本身来访问,这就是为什么Set集合中的元素不能重复的原因
Set集合判断元素是否相等的标准
因为Set集合中的元素不能重复,所以Set集合一定实现了某个方法来判断集合元素相等,Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象;
Set实现类不同的依据(集合内部排序的方法不同)
1.HashSet(排序的依据是元素的HashCode值)
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,依然可以添加成功。
简单地说,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等2.
2.LinkedHashSet
HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
3.TreeSet
TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态,这里说的排序状态不是只输入顺序,而是指TreeSet中的元素通过Comparator()接口对元素排序以后,元素的排列分先后,有点类似于数组,而不是像Set一样混乱的摆放就像在一个罐子里一样,杂乱无章,因此TreeSet增加了访问第一个、前一个、后一个、最后一个元素的方法,并提供了三个从TreeSet中截取子TreeSet的方法。
1.Comparator comparator():如果TreeSet采用了定制排序,则该方法返回定制排序所使用的Comparator;如果TreeSet采用了自然排序,则返回null。
2.Object first():返回集合中的第一个元素。
3.Object last():返回集合中的最后一个元素。
4.Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet集合里的元素)。
5.Object higher (Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是TreeSet集合里的元素)。
6.SortedSet subSet(fromElement, toElement):返回此Set的子集合,范围从fromElement(包含)到toElement(不包含)。
7.SortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素组成。
8.SortedSet tailSet(fromElement):返回此Set的子集,由大于或等于fromElement的元素组成。
4.EnumSet:
EnumSet是一个专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。