第三天的学习:
Set接口的方法基本和List一样。
Set特点:
存储顺序是随机的,迭代的顺序也是随机的(每次迭代的顺序都是不一样的);
无法存储重复的数据,当向Set中存储重复的袁旭的时候返回false
Set无索引, 不能利用索引遍历,可以用迭代器遍历。(也可以用增强for循环)
HashSet存储,遍历:
作用:可以用来去除重复的元素。
注意:HashSet存储自定义对象,并保证元素的唯一性。需要重写hashCode()和equals方法。
使用HashSet去除重复数据的好处:减少了比较,优化了HashCode()方法,
最终版本利用编辑器自动生成即可。
HashSet原理:
利用Set集合去除重复元素的时候,如果重复使用equals()比较,效率较底,哈希算法提高了去重的效率。
降低了使用equals()次数。
具体执行原理:
1,当HashSet调用add()方法的时候,会先调用hashCode()方法得到一个哈希值;
2,然后就去集合中寻找是否存在哈希值相同的对象;
3,如果没有哈希值相同的对象,则存入集合;
4,如果有,就拿当前对象和哈希值相同的对象逐个进行equals()比较;
5,根据比较结果,决定是否存入集合中。
关于重写equals()方法和hashCode()方法的原则:
hashCode():属性相同的对象返回值必须相同(为了去重),属性不同的返回值尽量不同(为了减少比较).
equals():属性相同的返回true,不同则false。
LinkedHashSet:是HashSet的一个子类,底层是链表实现的。它可以保证元素不重复,也可以保证存取一致。
TreeSet:不仅可以去重,还可以实现排序。底层数据结构是排序二叉树。
TreeSet排序的两种方式:自然排序,比较器排序:
自然排序:
TreeSet中的add()方法会把存入的对象提升为Comparable类型;
调用对象的CompareTo()方法和集合中的对象进行比较;
根据结果进行存储.
比较器排序:
创建TreeSet的时候指定一个比较器Comparator;
如果传入的Comparator子类对象,那么TreeSet则会按照比较器里的规则进行排序;
add()方法会自动调用Comparable接口中的compareTo()方法进行排序;
区别:
如果TreeSet构造方法没有参数,默认会按照类中的Comparable的规则排序,(没有就报错ClassCastException)
如果构造方法传入了Compartor,就优先按照Compartor排序. |
|