7.List系列下集合(上篇)

  • 目录

    1.数组和集合的区别

    2.集合类体系结构

    3.Collection集合

    4.ArrayList集合

    5.LinkedList集合

    6.迭代器源码分析

  • 1.数组和集合的区别

    • 1.1相同点
      • 都是容器,可以存储多个数据
    • 1.2不同点
      • 数组的长度是不可变的,集合的长度是可变的
      • 数组可以存基本数据类型和引用数据类型
      • 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
  • 2.集合类体系结构

    • 2.1集合体系结构

  • 3.Collection集合

    • 3.1Collection集合概述
      • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
      • JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
    • 3.2创建Collection集合的对象
      • 多态的方式
        Collection<String> c = new ArrayList<>();
      • 具体的实现类ArrayList
        ArrayList<String> list = new ArrayList<>();
    • 3.3Collection集合的常用方法
      • boolean add(E e)
        添加元素,List系列永远返回True,因为可以重复
      • boolean remove(Object o)
        从集合中移除指定的元素
      • boolean removeIf(Object o)
        根据条件进行移除
      • void clear()
        清空集合中的元素
      • boolean contains(Object o)
        判断集合中是否存在指定的元素。
        ​底层是依赖equals方法进行判断是否存在的,所以,如果集合中存储的是自定义对象,
        ​也想通过contains方法来判断是否包含,那么在JavaBean类中,一定要重写equals方法。
      • boolean isEmpty()
        判断集合是否为空
      • int size()
        集合的长度,也就是集合中元素的个数
    • 3.4Collection集合的遍历
      • 迭代器
        • 迭代器介绍
          不依赖索引
          • 迭代器是集合的专用遍历方式
          • Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到 (默认指向0索引)
        • Iterator中的常用方法
          两个方法要对应这写
          • boolean hasNext(): 判断当前位置是否有元素可以被取出
          • E next(): 获取当前位置的元素,并将迭代器对象移向下一个索引位置
        • Collection集合的遍历

        • 迭代器中删除的方法
          • void remove(): 删除迭代器对象当前指向的元素
            it.remove();(删除的是it指针指向的位置的值)
        • 细节
          • 1.迭代器遍历完毕,指针不会复位
            迭代器就好比是一个箭头,默认指向集合的0索引处
          • 2.报错NoSuchElementException
            循环结束之后,迭代器的指针已经指向了最后没有元素的位置
          • 3.循环中只能用一次next方法
            注意next方法的解释,会将迭代器对象移动下一个索引位置(集合位置只有一个指针,多个next会拿这一个指针去移动)
          • 4.迭代器遍历时,不能用集合的方法进行增加或者删除
            可以用迭代器中的删除方法
      • 增强for
        • 介绍
          • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
          • 实现Iterable接口的类才可以使用迭代器和增强for
          • 所有的单列集合和数组才能使用增强for进行遍历
          • 简化数组和Collection集合的遍历
        • 格式
          • for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {
          • // 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
          • }
        • 代码
          • for(String str : list){
          • System.out.println(str);
          • }
        • 细节
          • 修改增强for中的变量,不会改变集合中原本的数据
            将元素赋值给第三方变量(第三方变量是自己开一个空间)
        • 快速生成方式
          • 集合名字+for 回车
      • Lambda表达式
        • 利用forEach方法,结合12.Lambda表达式的方式进行遍历
        • default void forEach(Consumer<? super T> action);
        • Consumer是一个函数式接口
  • 4.ArrayList集合

    • 4.1List集合的概述与特点
      • 有序集合,这里的有序指的是存取顺序(存取有序)
      • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素(有索引)
      • 与Set集合不同,列表通常允许重复的元素(可以重复)
    • 4.2List集合的特有方法
      • void add(int index,E element)
        在此集合中的指定位置插入指定的元素
      • E remove(int index)
        删除指定索引处的元素,返回被删除的元素
      • E set(int index,E element)
        修改指定索引处的元素,返回被修改的元素
      • E get(int index)
        返回指定索引处的元素
    • 4.3List集合的五种遍历方式
      • 迭代器
      • 增强for
      • Lambda表达式
      • 普通for循环
    • 4.4List集合中的两个删除的方法
      • 直接删除元素(boolean remove(Object o))
      • 通过索引进行删除(E remove(int index))
      • 所以删除时 list.remove(1); 是删除1这个元素,还是1索引上的元素?
        • 因为在调用方法的时候,如果方法出现了重载现象
        • 优先调用,实参跟形参类型一致的那个方法。
    • 4.5ArrayList源码分析
      • 核心步骤:
        • 1.创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。
          添加第第一个元素时,底层会创建一个新的长度为10的数组。
          • 数组名字:elementDate,定义变量size。
            size这个变量有两层含义:①:元素的个数,也就是集合的长度②:下一个元素的存入位置
        • 2.添加元素,添加完毕后,size++
      • 扩容时机一
        • 当存满时候,会创建一个新的数组,新数组的长度,是原来的1.5倍,也就是长度为15.再把所有的元素,全拷贝到新数组中。如果继续添加数据,这个长度为15的数组也满了,那么下次还会继续扩容,还是1.5倍。
      • 扩容时机二
        • 如果一次添加多个元素,1.5倍放不下,那么新创建数组的长度以实际为准。
      • 添加一个元素时的扩容
        • 流程图

      • 添加多个元素时的扩容(有addall()方法一次添加多个元素)
        • 流程图

  • 5.LinkedList集合

    • 5.1List集合的特点
      • ArrayList集合:底层是数组结构实现,查询快、增删慢
      • LinkedList集合:底层是链表结构实现,查询慢、增删快
    • 5.2LinkedList集合的特有方法
      • public void addFirst(E e)
        在该列表开头插入指定的元素
      • public void addLast(E e)
        将指定的元素追加到此列表的末尾
      • public E getFirst()
        返回此列表中的第一个元素
      • public E getLast()
        返回此列表中的最后一个元素
      • public E removeFirst()
        从此列表中删除并返回第一个元素
      • public E removeLast()
        从此列表中删除并返回最后一个元素
    • 5.3LinkedList源码分析
      • 底层是双向链表结构
      • 核心步骤:
        • 1.刚开始创建的时候,底层创建了两个变量:一个记录头结点first,一个记录尾结点last,默认为null
        • 2.添加第一个元素时,底层创建一个结点对象,first和last都记录这个结点的地址值
        • 3.添加第二个元素时,底层创建一个结点对象,第一个结点会记录第二个结点的地址值,last会记录新结点的地址值
      • 流程图

  • 6.迭代器源码分析

    • 迭代器遍历时的相关流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zd08

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值