1. set
set 继承于 Collection 接口,是一个不允许出现重复元素,且无序的集合,主要有 HashSet 和 TreeSet 两大实现类
在判断重复元素的时候,Set 集合汇调用 hashCode() 和 equals() 方法来实现
HashSet 是哈希表结构,主要利用 HashMap 的 key 来存储元素,计算插入元素的 hashCode 来获取元素在集合中的位置
TreeSet 是树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序
2. set 集合框架结构
3. set 常用方法
与 List 接口一样, Set 接口也提供了对集合操作的基本方法
但不同的是,set 还提供了 equals() 和 hashCode() ,供其子类重写
public interface Set<E> extends Collection<E> { // 添加功能 // 当添加元素在集合中已经存在时,会返回"false" boolean add(E e); boolean addAll(Collection<? extends E> c); // 删除功能 boolean remove(Object o); boolean removeAll(Collection<?> c); void clear(); // 长度功能 int size(); // 判断功能 boolean isEmpty(); boolean contains(Object o); boolean containsAll(Collection<?> c); boolean retainAll(Collection<?> c); // 获取Set集合的迭代器: Iterator<E> iterator(); // 把集合转换成数组 Object[] toArray(); <T> T[] toArray(T[] a); // 判断元素是否重复,为子类提供重写方法 boolean equals(Object o); int hashCode(); }
4. HashSet
HashSet 实现set接口, 底层由HashMap来实现, 为哈希表结构,新增元素相当于HashMap的key,value默认为一个固定的Object。
当有元素插入的时候,会计算元素的hashCode值,将元素插入到哈希表对应的位置中来
4.1 HashSet 的特点
- 不允许出现重复元素
- 允许插入Null值
- 元素无序
5. Set相关题目
本题目利用set元素不重复的原则,当一个元素在set中已经存在,第二次add时就会返回false,我们就可知道重复的元素
class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>(); int tmp = -1; for (int num : nums) { if (!set.add(num)) { tmp = num; break; } } return tmp; } }