Set特性
- Set是继承自Collection的一个接口类
- Set中只存储了key,并且要求key一定要唯一
3.TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的 - Set最大的功能就是对集合中的元素进行去重
- 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。
- Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
- TreeSet中不能插入null的key,HashSet可以。
8.Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
添加
//添加元素,但重复元素不会被添加成功
boolean add(E e);
清空
//清空集合
oid clear();
判断key是否存在
boolean contains(Object o);
返回迭代器
//迭代器也是个对象,且是set的内部类,可以用这个内部类实现迭代的效果
Iterator iterator()
集合中删除key
boolean remove(Object o);
返回元素个数
//返回set中元素的个数
int size();
判断集合是否为空
//检测set是否为空,空返回true,否则返回false
boolean isEmpty();
set转数组
//将set中的元素转换为数组返回
Object[] toArray();
判断一个集合中元素是否都在集合中
//集合c中的元素是否在set中全部存在,是返回true,否则返回 false
boolean containsAll(Collection c);
往其他集合添加另一个集合
//将集合c中的元素添加到set中,可以达到去重的效果
boolean addAll(Collection c);
Set的迭代
不管是HashSet还是TreeSet的遍历都是有序的,set的迭代器继承Iterator类
迭代器遍历
Set<String> s = new TreeSet<>();
Iterator<String> it = s.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
范围for遍历
for(String e: s){
System.out.print( e + " ");
}
-
在使用迭代器的过程中,it.hasNext()方法不涉及指针的移动,只是判断当前指针是否超出下标,也就是判断是否还有下一元素。
-
而it.next()方法从源码来看则是先将指针下移并且取得当前元素。整个过程中只有next()方法涉及指针的下移.
-
it.next本质是先获取当前元素,在移动指针到下一个元素
TreeSet和HashMap的区别
Set底层结构 | TreeSet | HashSet |
---|---|---|
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间 复杂度 | O(log2N) | O(1) |
是否有序 | 关于Key有序 | 不一定有序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 按照红黑树的特性来进行插入和删除 | 先计算key哈希地址 2. 然后进行 插入和删除 |
比较与覆写 | key必须能够比较,否则会抛出 ClassCastException异常 | 自定义类型需要覆写equals和 hashCode方法 |
应用场景 | 需要Key有序场景下 | Key是否有序不关心,需要更高的 时间性能 |