黑马程序员技术交流社区

标题: set回顾课堂笔记 [打印本页]

作者: 小青年oh    时间: 2016-3-29 23:08
标题: set回顾课堂笔记
回顾:
        List体系
       
        栈:
       
        队列:
       
        数组:
       
        链表:
       
        List体系的三个子类
                ArrayList -- 数据结构 数组
               
                Vector -- 数据结构 数组
                        特有功能
                               
               
                LinkedList -- 数据结构 链表
                        特有功能
                                First
                                Last
                面试题: 模拟栈结构
               
                泛型:明确数据类型的工作放在创建对象 或者 调用方法的时候
                        类型转换异常
                       
                        三个应用:泛型接口   泛型类   泛型方法
                       
                Arrays工具类
                        toString()
                        sort()
                        binarySearch()
       

1、 Set
                特点:元素无序 , 唯一
                        注意这个顺序,指的是元素存入和取出的顺序
                       
                set是一个不包含重复元素的 collection
                        HashSet它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
                       
                HashSet元素无序的解释:
                        要理解这个问题应该考虑到Set是个接口。接口的规则很单纯,不会做过多的保证。
                        Set的规则重点就是“元素不重复的集合”,而对顺序不做保证。
                        实现该接口的类既可以提供有序的实现,也可以提供无序的实现。
                        HashSet在保存数据的时候显然还是得按一定顺序放入其中(通过hash算法),但顺序不是用户可控制的,对用户来说就是“无序”。                
                       
                HashSet add源码分析
               
                        HashSet 里面封装了 hashMap
                       
                        调用HashSet的 add()  实际走 hashMap的put()
                       
                        put()方法里面 首先去算了对象的hash值 -- 调用对象的hashCode()
                       
                        (e.hash == hash && ((k = e.key) == key||key.equals(k)))
                       
                        如果hash值不等,直接断定元素不一样,添加
                        如果相等,走后面的判断 e.key == key  ||  key.equals(k)  依赖于equals() 方法。
                       
                        如果equals返回的也是true,那么元素重复了。
                       
                        结论:HashSet保证元素唯一 依赖于元素的 hashCode()  和 equals() 方法
                       
                                HashSet 重复的元素,添加失败。
                                TreeSet 重复的元素,也是添加失败的。
                               
       
                TreeSet 里面对元素进行了自然排序。

                TreeSet 对元素进行排序:
                        1.让元素具有比较性 -- 实现Comparable 接口
                                根据compareTo()方法的返回值,来判断元素的顺序,并保证元素的唯一。
                                        正数:元素往后放
                                        负数:元素往前放
                                        0:表示元素重复,不添加。
                        2.让集合具备比较性 , 使用集合的带参构造
                                TreeSet(Comparator comparator)
                               
                                -- 建议大家使用这种方式:开发原则 -- 对修改关闭,对扩展开放。
                                自定义比较器去实现Comparator接口。
                               
                               
                                构造一个新的空 TreeSet,它根据指定比较器进行排序。
                       
                        需求:我想按学生的年龄排序:
                                this.age - s.age
                       
               
                需求1:按照对象的年龄排序,从小到大排序

                 public int compareTo(Student s) {
                         // 需求是比较年龄
                         int num = this.age - s.age;
                         // 由于对象有多个成员变量,你不能根据其中的某一个决定其他的。
                         // 当某一个相同的时候,你还需要判断其他的是不是也是相同的。
                         int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
                         return num2;
                 }
                }
                需求2:按照对象的姓名长度,从小到大排序,怎么做?

               
                TreeSet 底层数据结构是二叉树
                        满二叉树  完全二叉树
                       
                        保存数据的时候: 第一个元素先放到跟节点。其他的元素进来 与根节点比较
                                                        如果小,放左边
                                                        如果大,放右边。
                                                        如果一样,替换。
                                                取出:从根节点开始拿,按照左中右的顺序。
               
                       
                匿名内部类回顾:
                        格式:
                        new 接口或抽象类名 () {
                                // 重写抽象方法
                        }
               
        Collections                工具类:
                排序: sort(List list)
                二分查找:binarySearch(List list)
                反转 : reverse(List list)
                随机置换: shuffle(List list)
               
                最值:max / min (Collection c)
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
       






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