Java 集合进阶(一)
目录1.Java 集合整体体系单列 / 双列区分2.Collection 顶层父接口所有单列集合通用方法3.单列集合三种通用遍历迭代器、增强 for、Lambda forEach4.List 接口特点、独有索引方法、5 种遍历方式5.四大基础数据结构栈 / 队列 / 数组 / 链表底层特性一、Java 集合整体体系1.两大分类单列集合 Collection每次只能存单个元素一次添加一个双列集合 Map每次存一对键值对 (key-value)一次存两个关联数据如商品名 价格2.Collection 下两大分支接口1List 系列有序、可重复、有索引实现类ArrayList、LinkedList、Vector过时了解即可•有序存入顺序 取出顺序和大小排序无关•可重复允许存放相同元素•有索引可以通过下标获取 / 修改元素2Set 系列无序、不可重复、无索引实现类HashSet、TreeSet、LinkedHashSet•无序存入、取出顺序可能不一致•不重复自动去重业务常用去重场景•无索引不能通过下标操作元素标识区分红色 接口不能 new 对象蓝色 实现类可直接创建对象我们之前学的 ArrayList 只是集合体系冰山一角。二、Collection 顶层父接口核心结论Collection 是所有单列集合的祖宗接口List、Set 全部继承它里面所有方法单列集合通用。Collection 是接口不能直接 new创建对象要用多态Collection coll new ArrayList();Collection 6 大通用方法1.add (E e) 添加元素返回 boolean•List 集合永远返回 true允许重复•Set 集合元素不存在 true元素已存在 false去重机制2.clear () 清空集合删除集合内所有元素集合变为空集合。3.remove (Object o) 根据对象删除⚠️ 注意Collection 通用方法只能传对象不能传索引Set 无索引无法统一提供按索引删除返回 boolean元素存在删除成功 true不存在 false。4.contains (Object o) 判断是否包含元素底层核心考点底层依赖equals()方法对比对象•字符串、包装类Java 已经重写 equals对比内容直接使用•自定义类Student/Teacher 等默认用 Object 的 equals对比地址值内容相同不同对象会返回 false必须手动重写 equals 方法AltInsert 快速生成示例两个 name、age 完全相同的 Student 对象不重写 equalscoll.contains (新学生) 结果为 false。5.isEmpty () 判断集合是否为空底层判断集合 size ()0空返回 true有元素 false。6.size () 获取集合元素个数返回 int三、Collection 三种通用遍历方式Set 无索引普通 for 循环靠下标不能用以下三种 List/Set 全部通用。方式 1迭代器 Iterator无索引遍历遍历中可删除1.使用三步1.获取迭代器Iterator it coll.iterator(); 指针默认在集合 0 号元素前2.boolean hasNext()判断指针下一位是否有元素有 true 无 false3.E next()①取出下一个元素 ②指针向后移动一位基础代码模板IteratorStringitcoll.iterator();while(it.hasNext()){Stringsit.next();System.out.println(s);}4.迭代器 4 大必记坑点无元素时调用 next () → NoSuchElementException 无元素异常不是下标越界迭代器无索引遍历完毕指针不会自动复位再次遍历需要重新获取新迭代器一次 hasNext 只能配套一次 next循环内多次 next 会跳过元素、直接报错需要先用变量接收元素遍历过程中不能用集合 add/remove 方法会抛出ConcurrentModificationException并发修改异常解决需要删除用迭代器自带it.remove()迭代器无 add 方法遍历中无法新增元素方式 2增强 for 循环JDK5底层迭代器仅遍历适用范围所有单列集合、数组双列 Map 不能直接使用格式for(元素类型 变量 : 集合/数组){}快捷生成集合名.for 回车自动补全示例for(Strings:coll){System.out.println(s);}细节循环内的变量只是拷贝副本修改变量不会改变原集合中的元素。方式 3forEach Lambda 遍历JDK8最简仅遍历集合forEach()方法参数为 Consumer 函数式接口1.完整匿名内部写法2.简化 Lambda 写法一行打印javacoll.forEach(s-System.out.println(s));底层普通 for 循环遍历依次把每个元素传给 accept 方法执行操作。三种遍历选择场景1.遍历过程需要删除元素 → 迭代器 Iterator2.仅查看、无需增删 → 增强 for / Lambda forEach代码最简四、List 接口有序可重复有索引基础特性继承 Collection拥有上面全部 6 个方法 3 种通用遍历独有特性有索引提供基于下标操作的 4 个特有方法。List 四大独有索引方法1.add(int index,E e)指定下标插入元素原元素整体后移2.E remove(int index)按下标删除返回被删除元素⚠️ 重载坑list.remove(1)实参 int 优先匹配下标删除如果要删除数字 1 这个 Integer 对象需要手动装箱Integer.valueOf(1)3.set(int index,E e)修改指定下标元素返回旧元素4.E get(int index)根据下标获取元素可配合 size () 实现普通 for 循环List 共 5 种遍历方式1.迭代器 Iterator通用2.增强 for通用3.Lambda forEach通用4.普通 for 循环独有依靠 getsize需要下标时使用5.ListIterator 列表迭代器List 独有Set 不能用ListIterator 列表迭代继承 Iterator新增add(E e)遍历过程中添加元素不会并发修改异常hasPrevious() / previous() 反向遍历前提先正向走完指针到末尾初始指针在头部直接反向会报错遍历场景选择•仅遍历增强 for / Lambda•遍历要删除Iterator•遍历要新增ListIteratorList 专属•需要操作下标普通 for 循环五、四大基础数据结构ArrayList/LinkedList 底层原理前置1.栈 Stack特点先进后出后进先出结构单端开口栈顶一端封闭数据栈顶进、栈顶出。2.队列 Queue特点先进先出后进后出结构两端开口后端入队前端出队。3.数组ArrayList 底层内存连续整块空间优点根据索引查询速度极快缺点中间 / 头部增删后续元素全部移位效率低4.链表LinkedList 底层分单向 / 双向基础单元节点存储数据 下一个节点地址内存不连续单向链表只能从头向后遍历双向链表节点存前驱 后继地址头尾双向查找查询效率提升优点增删只修改节点地址无需移动大量元素速度快缺点无随机索引查询必须从头遍历速度慢四大结构对比速记栈先进后出队列先进先出数组查询快增删慢链表查询慢增删快拓展ArrayList 底层是数组LinkedList 底层是双向链表二者增删查询性能完全相反业务按需选择。Vector 数组结构、线程安全性能差开发淘汰。