黑马程序员技术交流社区

标题: 集合考点难点整理 [打印本页]

作者: 梅子派    时间: 2015-12-13 19:50
标题: 集合考点难点整理
1.集合框架
        Collection:(1)单列集合顶层接口;(2)Set 体系具有唯一性;(3)数据结构针对元素有效
                List 体系(接口):有序(存取顺序一致),可重复
                        ArrayList:底层结构是数组,查询快(修改快),增删慢,线程不安全(实现不同步),效率高
                        Vector:底层结构是数组,查询快(修改快),增删慢,线程安全(实现同步),效率低
                        LinkedList:底层结构是链表,查询慢(修改慢),增删快,线程不安全(实现不同步),效率高

                Set 体系(接口):无序,(存取的顺序不同),唯一性
                        HashSet:(底层依赖的是HashMap)底层数据结构是哈希算法,依赖于hashCode()和equals()保证唯一性
                                LinkedHashSet:底层数据结构是链表,具有唯一性,Set体系中唯一一个可以保证存取一致的集合类

                        TreeSet:底层数据结构是二叉树算法,具有唯一性,可以对元素排序
                                保证元素唯一性的方式:
                                  第一种:让基本类去实现Comparable接口,然后重写接口中的compareTo()方法
                                        compareTo()方法返回值是一个int类型:
                                                如果是0:说明元素相同,不添加。
                                                如果是正数: 就正序存储。(元素往右边放)
                                                如果是负数: 就倒序存储。(元素往左边放)
                                   第二种:创建TreeSet集合对象的时候,传一个比较器Comparator接口的 子类对象进来。
                                        代码示例:
                                                TreeSet<Person> ts = new TreeSet<>( new Comparator<Person>() {
                                                        @Override
                                                public int compare(Person p1, Person p2) {
                                                                //按照年龄排序
                                                        return p2.getAge() - p1.getAge();
                                                                        }
                                                        //重写接口中的所有抽象方法
                                                } );

                                                注意:
                                                        如果创建TreeSet集合对象的时候传入了比较器接口对象,并且基本类也实现了                                                        Comparable接口,那么,排序的规则优先使用: 传入的比较器接口。
                                                                简单记:
                                                                        如果两种排序方式都有,优先使用集合自带的比较器接口。
                               
                                                        如果是升序(从小到大)排列:就是 this. - p.
                                                        如果是降序(从大到小)排列:就是 p. - this.
                                                                简单记:
                                                                        前-后 就是从小到大, 后-前就是从大到小。
       
        Map:(1)双列集合顶层接口;(2)键具有唯一性;(3)数据结构针对键有效
                HashMap:底层数据结构是哈希算法,如果存储的元素,键是自定义类型,要保证键的唯一,必须重写                                                    hashCode()和equals()方法。
                        输出语句直接打印对象,默认调用的是该对象的toString()方法,
                        如果打印的不是地址值,那么肯定该类或者该类的父类重写了Object类中的toString()方法。
                                LinkedHashMap:底层数据结构是链表,可以保证怎么存就怎么取(存取一致)
                TreeMap:底层数据结构是二叉树算法,具有唯一性,可以对元素排序
                        存的键如果是自定义类型,如何保证键的唯一性?
                        第一种:自然排序
                                让该自定义类型去实现 Comparable接口,然后重写接口中的compareTo()方法

                        第二种:比较器接口
                                创建TreeMap集合对象的时候,传入一个比较器接口Comparator的子类对象,重写接口中的compare()方法

2.到底什么时候决定使用哪种集合?
        答:看需求:
        1,首先看是需要用单列集合还是双列集合
                        (1)单列集合: Collection
                2-1.1,看是否需要元素唯一性
                                        a,List:不唯一
                                3-1.2.a,看是否需要排序
                                                        HashSet:无序性
                                                        TreeSet:有序性
                                                        不明确的情况下,优先考虑使用 HashSet
                                        b,Set:唯一
                                3-1.2.b,看增删多还是查询多
                                                        LinkedList:底层数据结构是链表,查询慢,增删快
                                                        ArrayList:底层数据结构是数组,查询快,增删慢
                                                        不明确的情况下,优先考虑使用 ArrayList

                        (2)双列集合: Map
                2-2.1,看是否需要排序
                                        HashMap:无序性,底层数据结构是哈希算法
                                        TreeMap:有序性,底层数据结构是二叉树
                                        不明确的情况,优先考虑使用 HashMap

3.HashMap 和 Hashtable 的区别:
                HashMap:JDK1.2版本出现的,线程不安全,效率高。可以存null值和null键。
                Hashtable:JDK1.0版本出现的,线程安全,效率低,不可以存null值和null键。
                他们的相同点是:底层数据结构都是哈希算法,都是双列集合。
                        (HashTable正确写法是:Hashtable,因为集合的命名规范是JDK1.2版本以后出现的)



4.Collection和Map的区别:
        Collection:单列集合顶层接口,子体系Set体系具有唯一性,数据结构针对元素有效。
        Map:双列集合顶层接口,键具有唯一性,数据结构值针对键有效。
        他们都是集合的顶层接口。

5.什么是并发修改异常?
        答:ConcurrentModificationException (并发修改异常)
                产生原因:
                        通过普通的迭代器遍历集合的时候,又同时往集合中添加元素
                解决方案:
                        通过 ListIterator(列表迭代器)来遍历集合,并且通过列表迭代器中的add()方法往集合中添加元素。

6.HashCode()规则中值是多少?为什么?
                答:是31,
                        1,是质数
                        2,不大也不小
                        3,好算,正好是2向左移动五位之后减一
作者: yangmimi    时间: 2015-12-13 20:21
写的很好,赞赞
作者: hrfhwy    时间: 2015-12-13 22:21
总结的很好




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