Java集合精讲-上

集合板块

  • 学习容器(集合)的步骤:

    1. 如何创建容器
    2. 增删改查四类功能
    3. 遍历
  • 集合的特点:

    1. 集合的底层是数组 (集合的本质 = 数组 + 数据结构)
    2. 集合的长度可变 (在源码中帮助你创建新的数组) -> 优势
    3. 集合中只能存储引用数据类型的元素(集合中只能存对象) -> 弊端,弊端被解决了(包装类)
    4. 集合是代码中临时存储的容器
  • 集合种类的分类:

    1. 单列集合 : “长度可变的数组”
    2. 双列集合 : 两根长度可变的数组的组合

单列集合的体系结构

Java集合精讲-上_第1张图片

Collection集合

  • Collection集合 : 单列集合的根节点
    特点:
    1. 长度可变
    2. 只能存对象

  • 创建对象: //因为是接口只能创建多态对象
    Collection 集合名 = new 具体子类();

  • -格式解释:
    : 泛型
    用法: 创建集合对象的时候使用具体的 引用数据类型的类名去替换E即可
    作用: 泛型约束了集合中元素的数据类型
    注意: 前后的E必须一致 -> JDK7开始后面的E可以省略不写,但是<>不能省略
    例如:

      		Collection col = new ArrayList<>(); // 本质是一个ArrayList集合,集合中只能存储字符串对象
            Collection col = new ArrayList<>(); // 本质是一个ArrayList集合,集合中只能存储学生对象
            Collection col = new HashSet<>();// 本质是一个HashSet集合,集合中只能存取字符串对象
    
  • 增删改查四类功能:
    增: * boolean add(E e) : 添加元素
    删:
    * boolean remove(Object o) : 按照传入的元素删除,返回删除是否成功
    void clear(): 删除集合中所有的元素
    改: 因为Collection还没有索引,所以没有set方法
    查: 因为Collection还没有索引,所以没有get方法
    * int size() : 获取集合的长度/元素的个数
    * boolean contains(Object o) : 查询传入的元素是否包含于集合中
    * boolean isEmpty() : 查询集合是否为空

  • Collection集合的遍历方式

  • 方式一: 转数组
    Object[] toArray();

  • 方式二: 迭代器 -> 迭代器的接口 : Iterator
    Collection集合中有的方法 : Iterator iterator()
    迭代器的接口中的方法:
    boolean hasNext(): 判断集合中是否有下一个元素
    E next() : 获取集合的下一个元素

    • 迭代器操作时会产生的异常:
      ConcurrentModificationException : 并发修改异常 -> 只可能在迭代器中产生
      产生的原因是: 当使用迭代器对象遍历集合的时候,使用集合对象对原集合进行内容的修改,那么就会有并发修改异常产生
      解决方案:
      使用迭代器对象遍历集合的时候,不要使用集合对象对原集合进行增删改操作
  • 方式三: 增强for循环,foreach,超级for
    作用: 用来遍历集合和数组
    格式:
    for(泛型 变量名 : 集合对象/数组对象){
    循环体;
    }
    注意: 增强for的底层实现是 迭代器实现的;所以不要使用增强for遍历集合的时候修改集合内容
    //增强for遍历集合的时候底层是迭代器,增强for遍历数组的时候底层是普通fori

List集合的基本使用

  • List集合的特点: //接口

    1. 长度可变
    2. 只能存对象

    1. 元素可以重复
    2. 元素有索引
    3. 元素存取有序
  • 创建对象方式:
    //多态的方式创建对象
    List 集合名 = new List的实现类对象<>();

  • 增删改查四类功能: 相较于Collection新增了关于索引操作的方法
    增:

      boolean add(E e) : 依次添加元素到集合中,永远返回true
      void add(int index, E element) : 在指定索引位置添加元素 -> 插入元素
    

    删:

      boolean remove(Object e) : 按照元素值删除集合中的元素,返回删除是否成功
      E remove(int index) : 按照传入的索引删除集合中的元素,返回被删除的元素
      void clear(): 清空集合中的内容
    

    改:

    	E set(int index, E element): 修改指定索引位置的元素,返回被修改的元素
    

    查:

        E get(int index) : 获取指定索引位置上的元素
        int size(): 获取集合的元素个数/长度
      
        int indexOf(Object o) : 获取传入的元素第一次出现在集合中的索引位置
        int lastIndexOf(Object o)  : 获取传入的元素最后一次出现在集合中的索引位置
        boolean contains(Object o) : 判断传入的元素是否包含于集合中
        boolean isEmpty(): 判断集合内容是否为空
    

遍历:

1. 转数组
2. 迭代器 ->Iterator iterator()
3. 增强for
4. 普通for循环
5. list接口特有 -> 列表迭代器 
	ListIterator listIterator();

迭代器

  • 普通迭代器的底层原理

Java集合精讲-上_第2张图片

  • 列表迭代器的底层原理
  • ListIterator : 列表迭代器-> List接口下集合专属的一种迭代器

  • ListIterator 可以解决并发修改异常!!

  • 并发修改异常: 使用迭代器对象遍历集合的时候,使用集合对象对原集合进行修改!!

      解决方案1: 不要拿原集合修改集合内容
      	
      解决方案2: 使用列表迭代器对象对原集合进行修改 -> 先修改镜像,再立刻同步到原集合
    

Java集合精讲-上_第3张图片

ArrayList集合

  • ArrayList集合 : 底层数据结构是数组的List集合的实现

      	  最为常用的元素可以重复,元素有索引,元素存取有序的单列集合!!
          ArrayList:查询快,增删慢,线程不安全,效率高,可以存储重复元素
    
  • 创建对象方式:
    ArrayList 集合名 = new ArrayList<>();

  • 增删改查四类功能: 相较于Collection新增了关于索引操作的方法
    增:

      boolean add(E e) : 依次添加元素到集合中,永远返回true
      void add(int index, E element) : 在指定索引位置添加元素 -> 插入元素
    

    删:

      boolean remove(Object e) : 按照元素值删除集合中的元素,返回删除是否成功
      E remove(int index) : 按照传入的索引删除集合中的元素,返回被删除的元素
      void clear(): 清空集合中的内容
    

    改:

      E set(int index, E element): 修改指定索引位置的元素,返回被修改的元素
    

    查:

      E get(int index) : 获取指定索引位置上的元素
      int size(): 获取集合的元素个数/长度
      int indexOf(Object o) : 获取传入的元素第一次出现在集合中的索引位置
      int lastIndexOf(Object o)  : 获取传入的元素最后一次出现在集合中的索引位置
      boolean contains(Object o) : 判断传入的元素是否包含于集合中
      boolean isEmpty(): 判断集合内容是否为空    
    

遍历方式:

1. 转数组
2. 普通迭代器 -> Iterator
3. 增强for
4. 普通for 
5. 列表迭代器 -> ListIterator

ArrayList底层原理分析(以add())为例

问题: 当添加第1024个元素的时候,请问ArrayList集合底层数组的长度是多少?? — 1234

  • 底层原理:

    1.当你刚刚创建一个ArrayList集合对象的时候,源码会创建一个长度为0的数组
    2.当你添加第一个元素的时候,源码会创建一个长度为10的数组替换原来长度为0的数组
    3.当你添加第11个元素的时候,源码会对集合底层数组扩容,扩容到原来的1.5倍
    -> newCapacity = oldCapacity + (oldCapacity >> 1);
    4.每当你把底层数组的容量填满,源码会创建一个新的长度为原来数组长度1.5的数组去存储元素

Java集合精讲-上_第4张图片

彩蛋

  • 关于集合类型为包装类工作中遇到的小问题

    Java集合精讲-上_第5张图片

你可能感兴趣的:(java)