黑马程序员技术交流社区

标题: [系统学java]类集第三天 [打印本页]

作者: 友人A    时间: 2016-3-13 11:18
标题: [系统学java]类集第三天
第三天的学习:
        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排序.
作者: Lee♥晓蕾    时间: 2016-3-13 19:21





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2