黑马程序员技术交流社区

标题: 集合总结 [打印本页]

作者: cflying    时间: 2015-7-27 22:40
标题: 集合总结
集合
  |--Collection (两种遍历方式 普通迭代器 增强for循环)
        |--方法 add remove clear contains isEmpty size
        |--iterator()
               
                1):通过集合对象 (Collection的对象) 调用iterator(),生成迭代器对象
                        Collection c         = new ArrayList()
                        Iterator it =c.iterator()
                2):通过迭代器对象的hasNext()来判断集合是否有下一个元素
                3):如果有下一个对象 就通过迭代器对象的next()来获取下一个元素
                        while(it.hasNext()){
                                String str =(String)it.next();
                                System.out.println(str)
                        }
                        如果没有下一个对象 再获取的话 报错NoSuchElementException

                迭代器的原理:迭代器是一个借口
                迭代器的源码:迭代器是通过内部类的形式实现的
       
        |--List:特点  元素有序(存入和取出的顺序相同) 可以重复 可以通过索引操作元素(4种遍历方式 普通迭代器 列表迭代器 增强for普通for)
                |--方法:add remove set get indexOf subList
                |--ListIterator
                        ConcurrentModificationException 并发修改异常
                        ①:原因:在通过迭代器遍历集合的时候 我通过集合来操作(增删改)了集合里面的元素
                        ②:解决办法:
                                A:在迭代器遍历集合的时候,我们通过迭代器来操作元素
                                        ListIterator        列表迭代器
                                B:普通for循环来遍历集合的时候,通过集合来操作元素

               
                |--ArrayList:底层是数组的数据结构 查询快 增删慢 不安全 效率高
                       
                        案例:两个ArrayList去除重复自定义对象

                |--Vector:底层是数组的数据结构 查询快 增删慢 安全 效率低
                |--LinkedList:底层是链表的数据结构 查询慢 增删快 不安全 效率高
                        |--addFirst addLast removeFirst removeLast get.....
                        案例:用LinkedList来模拟栈结构

        泛型:1)去掉eclipse报黄线问题
                2)把运行期类型转换异常 提前到了编译期间
                3)优化程序设计
                        泛型类
                        泛型方法
                        泛型接口
                注意:泛型是jdk1.5的新特性
        增强for循环
                注意:增强for是jdk1.5的新特性

       
        |--Set:元素无序(存入和取出的顺序不相同) 唯一 (2种)
                |--HashSet
                        HashSet是如何保证元素唯一性的呢?
                        HashSet底层是用的哈希表结构
                        底层依赖两个方法hasCode() equals()
                                首先判断hasCode()返回值是否相同
                                        相同:判断equals()
                                                true:说明两个对象 相同  咱们就不添加
                                                false:说明两个对象 不相同 咱们就添加
                                        不相同:添加
                        所以说咱们要让元素所在的类 重写hasCode()和equals()方法
                        如何重写呢?eclipse直接生成
                |--TreeSet
                        1:自然排序:让TreeSet存储的元素所在的对象实现Comparable接口
                                通过compareTo()的返回值来保证元素的唯一(排序)
                                        正数:说明咱们要存入的这个元素比上一个元素大  往后放
                                        负数: 说明咱们要存入的这个元素比上一个元素小  往(钱)放                                                                                       
                                        0: 说明重复
                                        public int compareTo(Student s){
                                                int num =this.age-s.age;
                                                int num2 =(num==0)?this.name.compareTo(s.name):num;
                                                return num2;
                                        }
                        2: 通过比较器:Comparator 调用TreeSet的带参构造方法 传入一个比较器
                                让TreeSet就按照咱们这个比较器的规则来去掉重复和排序
                               
                                如果以后我们看到方法上的参数是抽象类或者接口的时候 我们可以考虑用匿名内部类来实现

        |--Collections集合的工具类
                sort() binarySearch() reverse() shuffle()
                |--案例:模拟斗地主发牌游戏

       
|--Map双列集合 (Map有几种遍历方式  2种)
        是存键值对形式的集合   键是不可以重复的 而值可以重复
       
        |--HashMap
                底层是哈希表结构 针对键有效 保证Map的键唯一
        |--TreeMap
                底层是二叉树结构 针对键有效 保证Map的键唯一和排序

        案例:获取字符串里面字符出现的次数

        Map的嵌套

                       
               




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