【 Collection集合、泛型】

今日内容
    Collection集合
    迭代器
    增强for
    泛型
    斗地主案例

Collection集合
    什么是集合
        集合就是一个容器,可以存储多个元素

    为什么要用集合
        之前我们学习过很多的容器,比如变量、数组、StringBuilder,有这么多容器,为什么还要使用集合呢?
        因为变量只能存储一个数据,不能存储多个
        因为数组有个弊端,一旦初始化长度就固定了
        因为StringBuilder虽然可以存储任意的数据,但是存储进去之后都拼接成字符串了,取用不方便
        所以咱们出现了一个非常重要而且常用的工具,就是集合

    集合的特点:
        (1)集合是一个容器,可以存储多个元素
            如果没有加泛型,一个集合中可以存储不同类型的数据
            如果加了泛型,一个集合只能存储泛型规定那同一类型的数据,推荐加泛型
        (2)集合的长度可以改变
        (3)集合只能存储引用数据类型的数据,不能存储基本数据类型的数据
            由于我们有了自动装箱,其实如果直接存储基本数据类型也是可以的,只不过是先将基本数据类型的数据转为了
            引用数据类型的数据,其实最终存储的还只能是引用数据类型的数据
        (4)集合有些有索引,有些没有索引

    面试题:
        数组和集合的区别?
              (1)数组长度固定,集合长度可变
              (2)数组可以存储任意类型的数据,集合只能存储引用数据类型的数据


    集合体系的由来
        集合不是一个类,而是一系列的类,集合就和我们现实世界的容器一样,现实世界的容器根据作用、特点、容量等
        不同可以分为不同的容器,Java中的集合也是类似的情况,根据集合的特点或者作用不同也分为很多的集合,不同集合
        有一些不同的特点,但是还会有很多相同的特点,相同的东西我们就可以不断向上抽取出父类(接口),最终就形参了
        集合的继承体系(集合的体系)

    集合的体系
        Collection(单列集合)
            |-List:存取有序(按什么顺序存进去,取出来也是什么顺序),有索引,可以存储重复元素
                |-ArrayList
                |-Vector
                |-LinkedList
            |-Set:存取无序,无索引,不能存储重复元素
                |-HashSet
                    |-LinkedHashSet
                |-TreeSet

        Map(双列集合)


        学习的时候从上往下
            因为最上面的父类(接口)定义最共性的内容,学习了共性那么下面所有的具体实现类共性操作我们都学会了
            学会了共性之后,再去针对某个具体的集合去学习它特性(非共性)的内容,那么所以的集合我们都能轻松搞定

        使用的时候从下往上
            使用的时候是使用具体的实现类的功能,上面的共性的类(接口)都是抽象的方法

Collection
    共性的常用方法
    增
        boolean add(E e)  :添加元素,添加成功返回true,添加失败返回false
    删
        void clear()  :清空集合(删除集合中的所有元素)
        boolean remove(Object o)  :删除集合中的指定元素
    查
        int size() :返回集合中的元素的个数
        Iterator<E> iterator()

    判断方法
        boolean contains(Object o)  :判断集合中是否包含该元素
        boolean isEmpty()  :判断集合中是否有元素

        增删改查

    面试题:
        以下方法不属于Collection接口的是(BD)
        A.remove(Object o)
        B.get(int index)
        C.clear()
        D.remove(int index)


迭代器
    一个取出集合元素(遍历)的工具

    Iterator接口
        boolean hasNext():判断集合中是否还有下一个元素
        E next()  :获取集合中下一个元素
        void remove() :删除集合中的元素

    使用迭代器去获取元素,如果没有元素就会抛出一个异常:NoSuchElementException

    步骤:
        (1)创建集合
        (2)添加元素
        (3)迭代器遍历
            a.获取到迭代器对象
            b.在while循环中判断是否有下一个元素
            c.在while循环中获取下一个元素

        // (1)创建集合
        Collection<String> c = new ArrayList<>();
        // (2)添加元素
        c.add("hello");
        c.add("world");
        c.add("java");
        c.add("php");
        // (3)迭代器遍历
        // a.获取到迭代器对象
        Iterator<String> it = c.iterator();
        // b.在while循环中判断是否有下一个元素
        while(it.hasNext()){
            // c.在while循环中获取下一个元素
            String str = it.next();
            System.out.println(str);
        }

集合的遍历方式
    方式一:普通for,结合get(int index)和size()方法     [只适用于List体系的集合]
        //创建一个集合对象
        ArrayList<String> coll = new ArrayList<>();
        //往集合中添加元素
        coll.add("姚明");
        coll.add("科比");
        coll.add("麦迪");
        coll.add("詹姆斯");
        coll.add("艾弗森");

        for (int i = 0; i < coll.size(); i++) {
            System.out.println(coll.get(i));
        }

    方式二:迭代器(Iterator)                       [适用于所有的Collection集合]
        // (1)创建集合
        Collection<String> c = new ArrayList<>();
        // (2)添加元素
        c.add("hello");
        c.add("world");
        c.add("java");
        c.add("php");
        // (3)迭代器遍历
        // a.获取到迭代器对象
        Iterator<String> it = c.iterator();
        // b.在while循环中判断是否有下一个元素
        while(it.hasNext()){
            // c.在while循环中获取下一个元素
            String str = it.next();
            System.out.println(str);
        }

    方式三:增强for                                   [适用于所有的Collection集合]
        // (1)创建集合
        Collection<String> c = new ArrayList<>();
        // (2)添加元素
        c.add("hello");
        c.add("world");
        c.add("java");
        c.add("php");

        for(String s:c){
            // s就是其中的每一个元素
            System.out.println(s);
        }


增强for
    JDK1.5的新特性,可以遍历数组和Collection集合

    格式:
        for(元素类型 元素名:数组或者Collection集合){
            System.out.println(元素名);
        }

    增强for的底层,遍历集合使用的是迭代器


    JDK1.5的新特性:
        自动拆装箱、增强for、泛型

泛型
    JDK1.5的新特性
    格式:<类型>
        泛型中的类型只能是引用数据类型

        ArrayList<int>              ×
        ArrayList<Integer>          √


    泛型可以理解成一种广泛的类型,不是固定的某种类型,你想让它是什么类型就可以是什么类型
    泛型中的类型就规定了集合中存储的元素的类型

    泛型使用的注意事项
        泛型前后必须一致
            ArrayList<Integer> list = new ArrayList<String>();      ×
            ArrayList<Integer> list = new ArrayList<Integer>();     √
        JDK1.7的新特性:菱形泛型,后面可以不加泛型
            ArrayList<Integer> list = new ArrayList<>();
    泛型的好处
        (1)省去了强转的麻烦,泛型规定了什么类型,取出元素自动就是那个类型
        (2)将解决问题的时间提前,将运行时期可能出现的异常,提前到了编译时期解决

猜你喜欢

转载自blog.csdn.net/L531003231/article/details/81748005