[数据结构] Set的使用与注意事项
目录
Set的说明
常见方法说明
注意事项
TreeSet使用案例
Set的说明
Set与Map主要的不同有两点: Set是继承自Collection的接口类,Set中只存储了Key.
常见方法说明
方法 | 解释 |
boolean add(E e) | 添加元素,但重复元素不会被添加成功 |
void clear() | 清空集合 |
boolean contains(Object o) | 判断o是否在集合中 |
Iterator<E> iterator() | 返回迭代器 |
boolean remove(Object o) | 删除集合中的o |
int size() | 返回集合中元素的个数 |
boolean isEmpty() | 检测set是否为空,空返回true,否则返回false |
Object[] toArray() | 将set中的元素转换为数组返回 |
boolean containsAll(Collection<?> c | 集合c中的元素是否在set中全部存在,是返回true,否则返回false |
boolean addAll(Collection<? extends E> c) | 将集合c中的元素添加到set中,可以达到去重的效果 |
注意事项
- Set是继承自Collection的一个类接口
- Set中只存储了Key,并且要求key一定要唯一(key不可以重复)
- TreeSet的底层是使用Map来实现的, 其使用key与Object的一个默认对象作为键值对插入到Map中的
- Set最大的功能就是对集合中的元素进行去重
- 实现Set接口的常用类有TreeSet和HashSet, 还有一个LinkedHashSet, LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序.
- Set中的key不能修改,如果要修改,先将原来的删除掉, 然后再重新加入
- TreeSet中不能插入null的key,HashSet可以.
Set底层结构 | TreeSet | HashSet |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间复杂度 | O(1) | |
是否有序 | 关于key有序 | 不一定有序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 按照红黑树的特性来进行插入和删除 | 1.先计算key哈希地址 2.然后进行插入和删除 |
比较与覆写 | key必须能够比较,否则会抛出ClassCastExcetion异常 | 自定义类型需要覆写equals和hashCode方法 |
应用场景 | 需要key有序场景下 | key是否有序不关心,需要更高的时间性能 |
TreeSet使用案例
public static void TestSet() {
Set<String> s = new TreeSet<>();
// add(key) : 如果key不存在,则插入,返回true;
// 如果key存在,返回false
boolean isIn = s.add("1");
System.out.println(isIn);
s.add("2");
s.add("3");
s.add("4");
s.add("5");
isIn = s.add("1");
System.out.println(isIn);
System.out.println(s.size());
System.out.println(s);
// add(key): key如果是空,抛出空指针异常
// s.add(null);
//contains(key): 如果key存在,返回true,否则返回false
System.out.println(s.contains("1"));
System.out.println(s.contains("10"));
// remove(key): key存在,删除成功返回true
// key不存在,删除失败,返回false
// key为空,抛出空指针异常
s.remove("1");
System.out.println(s);
s.remove("10");
System.out.println(s);
Iterator<String> it = s.iterator();
while(it.hasNext()) {
System.out.println(it.next() + " ");
}
System.out.println();
}