1.Set接口特点
- Set接口是无序的
- Set接口中的数据不允许重复
- Set接口无法通过下标访问数据
- 查找慢,插入删除快(底层数据结构是哈希表和红黑树)
- Set集合使用equals()和hashCode()方法实现元素去重
2.HashSet特点:
- HashSet是Set接口的实现类
- 线程不安全
HashSet避免对象重复的规则:
1)如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。
2)如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存储。如果结果为false,视为不同元素,进行存储。
如果对象元素要存储到HashSet中,必须覆盖hashCode方法和equals方法。才能保证从对象中的内容的角度保证唯一。
3.迭代器Iterator
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。
HashSet类中没有提供根据集合索引获取索引对应的值的⽅法,
因此遍历HashSet时需要使⽤Iterator迭代器。Iterator的主要⽅法如下
返回类型 |
方法 |
描述 |
boolean |
hasNext() |
如果有元素可迭代 |
Object |
next() |
返回迭代的下⼀个元素 |
4 TreeSet
TreeSet 基于TreeMap 实现。TreeSet可以实现有序集合,但是有序性需要通过比较器实现。
TreesSet特点:
- 有序
- 不重复
- 添加、删除、判断元素存在性效率比较高
- 线程不安全
TreeSet对元素进行排序的方式:
1) 如果是基本数据类型和String类型,无需其它操作,可以直接进行排序。
2) 对象类型元素排序,需要实现Comparable接口,并覆盖其compareTo方法。
3) 自己定义实现了Comparator接口的排序类,并将其传给TreeSet,实现自定义的排序规则。
5 LinkedHashSet
LinkedHashSet是一种有序的Set集合,其元素的存入和取出顺序是相同的。
public class Test { public static void main(String[] args) { // LinkedHashSet:链表结构的Set集合 // 1.不重复 2.能保证添加的次序(添加和输出次序一致) Set set = new LinkedHashSet(); set.add("c"); set.add("a"); set.add("d"); set.add("b"); System.out.println(set); }
}
//迭代器遍历Iterator iterator = hashSet.iterator();//获取迭代器对象 有序:有下标while (iterator.hasNext()){//判断是否指定能够移动Object next = iterator.next();//指定移动并获取当前的元素System.out.println(next);}//遍历--- foreachfor(Object o: hashSet){System.out.println(o);}}
}