<--
1.Set中重复元素不会存储进来,而Map则会覆盖!!!
2.局部内部类的使用必须在定义之后!!!
3.<?>与<E>的区别: 是否独立使用该类型!
-->
一.Set集合
1.什么是Set集合 Set集合和List集合类似, 都是可以用来存储对象, 长度可变.
Set集合和List不同的是: 没有重复元素, 没有存储顺序.
2.Set集合的常用方法 添加元素: boolean add(E e)
删除元素: boolean remove(Object o)
获取长度: int size()
获取迭代器: Iterator<E> iterator()
判断是否包含: boolean contains(Object o)
将另一个集合中的全部添加: boolean add(Collection<? extends E> c)
转换成数组: Object[] toArray()
T[] toArray(T[] a)
3.HashSet HashSet是Set的一个实现类, 它可以做到去重复, 效率非常高.
当我们需要把多个对象去重复的时候, 就可以使用HashSet.
存储原理:
使用HashSet存储对象的时候, 会先调用对象的hashCode()方法, 计算一个哈希值.
查找集合中是否有哈希值相同的对象
如果没有就直接存入
如果有哈希值相同的对象, 和相同的对象逐个进行equals比较
如果比较结果全部为false就存入
如果比较结果包含true就不存
用HashSet存储自定义对象:
对象需要重写hashCode()和equals()方法
hashCode方法要保证属性相同, 返回值相同, 属性不同尽量不同.
equals方法要确保属性相同的返回true, 不同的返回false.
4.LinkedHashSet 是HashSet的子类, 实现原理相同, 但可以保留存储顺序.
5.TreeSet TreeSet是Set的一个实现类, 可以去掉重复元素, 可以指定顺序. 按照指定的比较方式比较出元素的大小, 以二叉树形式进行存储.
自然顺序:
TreeSet默认按照compareTo方法中的顺序来排序.
compareTo是Comparable接口中的抽象方法, 如果想将自定义类的对象装入TreeSet排序, 那么就需要在类上实现Comparable, 重写compareTo方法
compareTo方法返回一个int值, TreeSet在存储对象的时候就会调用compareTo方法, 根据int值构建二叉树.
返回的int值如果是负数就代表小于, 正数代表大于, 0代表相等.
比较器顺序:
在创建TreeSet的时候, 可以在构造函数中传入一个Comparator接口的实现类.
传入Comparator之后, 再向TreeSet中添加元素时, 就会调用Comparator中的compare方法来比较了.