Bootstrap

Chp-14 -List 集合

集合框架

List  Set Map(都是接口)

概念

是一个容器,作用为存放多个数据,用于替代数组

特点

1,只能存放引用类型的数据,无法存放基本类型

2.所有的集合都产自Java.Util 包

List 存储特点

有序,有下标,元素可以重复

List 的常用实现类

1,ArrayList(最常用)

        JDK 1.2 底层数组实现 查询快 增删慢 线程不安全

                效率高

2.LinkedList (一般不用)

JDK1.2 底层链表实现 查询慢 ,增删快 线程不安全。效率高

3.Vector(基本不用)

创建

创建使用多态

List 集合名=new 实现类名()

实现类通常情况下也实现了其他接口,为了保障对象的单一职责更有利于后期维护和扩展,所以不建议直接创建实现类对象,使用多态可以约束集合对象的身份和使用内容

List list = new ArrayList();

常用方法

  1. boolean add(元素):向集合末尾添加一个元素

  2. void add(下标,元素):向集合指定下标位置添加一个元素

  3. Object[] toArray():将集合转换成数组

  4. boolean addAll(集合):将参数集合的所有元素添加至当前集合末尾

  5. void addAll(下标,集合):将参数集合的所有元素添加至当前集合指定下标位置

  6. boolean contains(元素):判断集合中是否存在指定元素

  7. 元素 get(下标):获取指定下标位置的元素

  8. 下标 indexOf(元素):获取指定元素第一次出现的下标,不存在返回-1

  9. 下标 lastIndexOf(元素):获取指定元素最后一次出现的下标,不存在返回-1

  10. 元素 remove(下标):删除指定下标位置的元素

  11. boolean remove(元素):删除指定元素

    • 当元素为整数时,无法使用该传参方式,因为会优先认定参数为下标值

    • 只会删除第一个匹配元素

  12. 旧元素 set(下标,新元素):将指定位置的元素替换新元素值

  13. int size():获取集合元素个数

遍历

1.下标遍历

for(int i=0; i<集合名.size(); i++){
    //通过集合名.get(i)获取当前被遍历的元素
}

    //创建集合
        List list = new ArrayList();
        list.add(88);
        list.add(30);
        list.add(99);
        list.add(21);
        //下标遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();

2.迭代器遍历

  1. 获取集合对应的迭代器对象Iterator

  2. 操作迭代器:

    • hasNext():判断是否存在下一元素

    • next():使指针后移一位,获取下一元素

//获取迭代器
Iterator it=集合名.iterator();
//循环迭代器
while(it.hasNext()){//有下一元素,继续执行
    //通过it.next()获取下一元素    
}
  • 注意:需要规避一次循环迭代过程中多次调用next()方法导致指针非法后移

  • 注意:迭代过程中不允许增删集合元素

    • 指针走向固定,更改集合长度会导致指针获取出现偏差

案例

//迭代器遍历
        //获取迭代器
        Iterator it = list.iterator();
        //循环迭代器
        while (it.hasNext()) {
            /*if (it.next() != null) {错误!!
                System.out.print(it.next()+" ");
            }*/
            //先接收本次读取数据
            Object o = it.next();
            if (o != null) {
                System.out.print(o+" ");
            }
           // list.add(11);错误!
            //list.remove(1);错误!
        }
        System.out.println();

3.foEach外遍历

for(数据类型 元素名(随便起):集合名){
    //元素名就代表当前元素
}
  • 本质仍然是迭代器遍历,所以过程中不可增删元素

  • JDK5.0

    for (Object o : list) {
            System.out.print(o+" ");
           // list.add(11);错误!
        }
        System.out.println();

4.forEach自遍历

集合名.forEach(Consumer接口实现类对象);

JDK 1.8

 list.forEach(new Consumer() {
            @Override
            public void accept(Object o) {
                //o就代表当前元素
                System.out.print(o+" ");
            }
        });
        System.out.println();
        //lambda简化
        list.forEach(o-> System.out.print(o+" "));

泛型

用在集合中,可以约束集合存放的数据类型

List<泛型类型> 集合名=new 实现类名<泛型类型>();

使用

  1. 如果存放基本类型,则需要声明为包装类型

  2. 前后泛型类型必须保持一致

  3. 前边泛型省略:导致泛型失效

  4. 后边泛型省略:无太大影响,语法不规范

  5. 通常情况下,后侧泛型会使用<>做语法占位

    如: List<Integer> list = new ArrayList<>();
    

     List<Integer> list = new ArrayList<>();
            list.add(60);
            list.add(50);
            list.add(40);
           /* list.add("abc");
            list.add(5.5);*/
            //迭代器遍历
            Iterator<Integer> it = list.iterator();
            while (it.hasNext()) {
                Integer n = it.next();
                System.out.print(n+" ");
            }
            System.out.println();
            //外遍历
            for (Integer i : list) {
                System.out.print(i+" ");
            }
            System.out.println();
            //自遍历
            list.forEach(new Consumer<Integer>() {
                @Override
                public void accept(Integer i) {
                    System.out.print(i+" ");
                }
            });

今日掌握

  1. 集合的特点

  2. List集合的存储特点、实现类及特点、遍历方式

  3. 泛型的作用和书写

;