一、集合基础概念1. 集合是Java中用于批量存储多个对象的容器工具区别于数组长度可动态变化。2. 集合全部相关接口、工具类都存放于java.util包下使用时需要导包。3. 学习集合统一遵循四个核心维度所有集合都按这个思路掌握1对应顶层接口的独有特性2接口中定义的增删改查核心方法3接口对应的底层实现类与底层原理4集合支持的全部遍历写法二、Collection单列集合体系一顶层父接口Collection1. 核心特性只能存储Object类型对象是所有单列集合的父规范无下标、无排序强制要求。2. 通用核心方法◦ add(Object o)向集合末尾添加元素返回添加成功标记开发高频使用◦ contains(Object o)判断集合内是否存在指定元素存在返回true不存在返回false◦ remove(Object o)匹配元素并从集合中删除完成删除返回true◦ size()获取集合当前存储的有效元素总个数3. 实现规则该接口没有直接可实例化的实现类所有功能由List、Set两个子接口落地实现4. 遍历规则自身不提供直接遍历方式遍历逻辑由两个子接口拓展实现二子接口一List有序可重复集合1. 核心特性存储元素有序、自带数字下标、允许存入重复元素下标取值区间0 ~ size()-1开发基础重点。2. 拓展独有方法继承Collection全部方法新增下标操作方法◦ add(Object o)无参下标重载默认把元素追加到集合尾部◦ add(int index, Object o)按下标位置插入元素原下标及后续元素自动后移◦ get(int index)根据下标读取对应位置元素List查询核心方法◦ remove(int index)按下标删除元素返回被删除的原对象◦ set(int index, Object o)修改指定下标元素返回修改前旧元素3. 三大常用实现类1. ArrayList底层基于动态数组实现随机查询速度极快中间增删元素需要移动数组效率偏低诞生于JDK1.2多线程并发下不安全单线程运行效率高。底层扩容规则创建对象时不会立刻初始化数组首次调用add添加元素才分配空间数组初始容量10容量不足时每次扩容至原长度1.5倍。2. Vector底层同样是数组查询快、中间增删慢JDK1.1早期类所有方法加同步锁多线程安全但单线程运行效率远低于ArrayList日常开发极少使用。3. LinkedList底层双向链表结构没有数组扩容开销首尾、中间增删元素效率极高随机下标查询需要从头遍历链表查询速度慢线程不安全单线程场景增删优先选择。面试拓展题ArrayList与LinkedList的核心区别从底层结构、查询效率、增删效率、线程安全四个维度作答。4. List三种遍历方式1. 下标for循环遍历依靠get方法按下标依次读取for(int i 0; i list.size(); i){Object obj list.get(i);}2. 增强for循环foreach开发最常用简化遍历方式for(数据类型 变量 : 集合对象){// 变量直接代表集合内每一个元素}底层本质是迭代器遍历的语法糖。3. 迭代器Iterator遍历foreach底层原理◦ 第一步通过集合iterator()方法获取迭代器对象◦ 第二步迭代器两个核心APIhasNext()判断迭代器中是否还有未读取元素有返回truenext()读取下一个元素指针向后移动一位◦ 完整遍历模板Iterator it list.iterator();while(it.hasNext()){Object element it.next();}三泛型1. 泛型集合给集合限定统一存储数据类型编译阶段做类型校验避免类型转换异常是开发重点语法。标准定义格式List存储类型 集合名 new ArrayList存储类型();2. 泛型类语法规则1. 定义语法class 类名泛型标识1,泛型标识2{}通用标识T、E、K、V2. 使用规范创建对象时必须前后泛型类型保持一致基础数据类型不能作为泛型只能使用对应包装类创建对象不写泛型默认全部识别为Object多泛型标识需要一次性全部指定或全部省略。四集合工具类Collections1. 定位专门操作Collection、List、Set集合的工具类内部全部静态方法无需创建对象直接类名调用。2. 高频静态方法◦ reverse(List list)反转List集合内元素存储顺序◦ shuffle(List list)打乱List集合元素顺序实现随机排列◦ sort(List list)对集合内元素进行升序排序3. 排序配套两种比较器1. 内置比较器Comparable需要存储的实体类实现该接口重写compareTo方法在实体类内部定义排序规则返回正数、负数、0区分大小。2. 外置比较器Comparator无需修改实体类排序时通过匿名内部类单独定义比较规则灵活切换多种排序逻辑。面试拓展题区分Collection接口与Collections工具类解析Collection是单列集合顶层父接口定义集合通用规范Collections是静态工具类提供操作集合的各类工具方法。五子接口二Set不可重复集合1. 核心特性无序存储、无下标索引、集合内元素不允许存储重复内容2. 方法体系完全继承Collection接口全部方法没有拓展下标相关方法3. 主流实现类1. HashSet开发、面试双重重点自定义对象存入HashSet去重规则必须重写实体类hashCode()与equals()两个方法。◦ hashCode重写规则相同属性对象返回一致哈希值不同属性尽量返回不同哈希值常规做法把所有成员变量哈希值相加返回。◦ equals重写规则两个对象所有属性全部相等时返回true判定为重复元素。HashSet去重底层流程存入对象先计算哈希值定位存储槽位槽位无元素直接存入槽位已有元素则调用equals对比全部属性相等则拒绝存入不相等则追加存储。2. LinkedHashSetHashSet子类底层链表哈希表保留元素添加顺序同时保证元素不重复自定义对象存储同样需要重写hashCode与equals。3. TreeSetSortedSet接口实现类自带自动排序自定义对象存储需要实现Comparable接口重写compareTo返回值为0判定为重复对象。4. Set遍历方式仅支持增强for循环、迭代器两种遍历无下标无法使用普通for循环。三、Map双列集合体系一Map核心特性1. 存储单位为键值对keyvalue一个集合元素包含两个对象2. 键key无序、无下标、全局唯一不允许重复3. 值value无序、无下标允许存入重复数据二Map通用核心方法• put(K key,V value)添加/修改键值对键不存在直接新增键已存在则覆盖旧值返回被覆盖的旧value开发高频方法• remove(K key)根据指定键删除整条键值对返回被删除的value• get(K key)根据键查询对应valueMap读取数据核心方法• containsKey(K key)判断集合是否存在指定key• containsValue(V value)判断集合是否存在指定value• size()获取当前集合键值对总数量三Map五大实现类1. HashMap开发核心重点JDK1.2推出线程不安全运行效率高key与value都允许存入null自定义对象作为key时实体类必须重写hashCode和equals保证键唯一业务中一般使用String、Integer作为key。2. HashtableJDK1.1早期类所有方法加同步锁多线程安全运行速度慢key、value都不允许存入null开发基本淘汰。面试拓展题HashMap与Hashtable完整区别3. PropertiesHashtable子类强制要求key和value只能是String字符串项目中常用来读取配置文件。4. LinkedHashMapHashMap子类底层链表维护存储顺序遍历顺序和添加顺序保持一致。5. TreeMapSortedMap接口实现类会根据key自动排序自定义对象作为key需要实现Comparable接口。四Map三种遍历方式1. 键遍历开发最常用通过keySet()获取全部key组成Set集合再遍历key搭配get方法读取对应valueSetK keySet map.keySet();for(K key : keySet){V value map.get(key);}2. 值遍历通过values()获取全部value组成Collection集合仅能操作值无法获取对应keyCollectionV values map.values();for(V v : values){}3. 键值对整体遍历通过entrySet()把每一组键值对封装为Map.Entry对象存入Set通过Entry的getKey()、getValue()直接获取键和值效率高于键遍历SetMap.EntryK,V entrySet map.entrySet();for(Map.EntryK,V entry : entrySet){K k entry.getKey();V v entry.getValue();}
第十三章 集合【开发的重点】
一、集合基础概念1. 集合是Java中用于批量存储多个对象的容器工具区别于数组长度可动态变化。2. 集合全部相关接口、工具类都存放于java.util包下使用时需要导包。3. 学习集合统一遵循四个核心维度所有集合都按这个思路掌握1对应顶层接口的独有特性2接口中定义的增删改查核心方法3接口对应的底层实现类与底层原理4集合支持的全部遍历写法二、Collection单列集合体系一顶层父接口Collection1. 核心特性只能存储Object类型对象是所有单列集合的父规范无下标、无排序强制要求。2. 通用核心方法◦ add(Object o)向集合末尾添加元素返回添加成功标记开发高频使用◦ contains(Object o)判断集合内是否存在指定元素存在返回true不存在返回false◦ remove(Object o)匹配元素并从集合中删除完成删除返回true◦ size()获取集合当前存储的有效元素总个数3. 实现规则该接口没有直接可实例化的实现类所有功能由List、Set两个子接口落地实现4. 遍历规则自身不提供直接遍历方式遍历逻辑由两个子接口拓展实现二子接口一List有序可重复集合1. 核心特性存储元素有序、自带数字下标、允许存入重复元素下标取值区间0 ~ size()-1开发基础重点。2. 拓展独有方法继承Collection全部方法新增下标操作方法◦ add(Object o)无参下标重载默认把元素追加到集合尾部◦ add(int index, Object o)按下标位置插入元素原下标及后续元素自动后移◦ get(int index)根据下标读取对应位置元素List查询核心方法◦ remove(int index)按下标删除元素返回被删除的原对象◦ set(int index, Object o)修改指定下标元素返回修改前旧元素3. 三大常用实现类1. ArrayList底层基于动态数组实现随机查询速度极快中间增删元素需要移动数组效率偏低诞生于JDK1.2多线程并发下不安全单线程运行效率高。底层扩容规则创建对象时不会立刻初始化数组首次调用add添加元素才分配空间数组初始容量10容量不足时每次扩容至原长度1.5倍。2. Vector底层同样是数组查询快、中间增删慢JDK1.1早期类所有方法加同步锁多线程安全但单线程运行效率远低于ArrayList日常开发极少使用。3. LinkedList底层双向链表结构没有数组扩容开销首尾、中间增删元素效率极高随机下标查询需要从头遍历链表查询速度慢线程不安全单线程场景增删优先选择。面试拓展题ArrayList与LinkedList的核心区别从底层结构、查询效率、增删效率、线程安全四个维度作答。4. List三种遍历方式1. 下标for循环遍历依靠get方法按下标依次读取for(int i 0; i list.size(); i){Object obj list.get(i);}2. 增强for循环foreach开发最常用简化遍历方式for(数据类型 变量 : 集合对象){// 变量直接代表集合内每一个元素}底层本质是迭代器遍历的语法糖。3. 迭代器Iterator遍历foreach底层原理◦ 第一步通过集合iterator()方法获取迭代器对象◦ 第二步迭代器两个核心APIhasNext()判断迭代器中是否还有未读取元素有返回truenext()读取下一个元素指针向后移动一位◦ 完整遍历模板Iterator it list.iterator();while(it.hasNext()){Object element it.next();}三泛型1. 泛型集合给集合限定统一存储数据类型编译阶段做类型校验避免类型转换异常是开发重点语法。标准定义格式List存储类型 集合名 new ArrayList存储类型();2. 泛型类语法规则1. 定义语法class 类名泛型标识1,泛型标识2{}通用标识T、E、K、V2. 使用规范创建对象时必须前后泛型类型保持一致基础数据类型不能作为泛型只能使用对应包装类创建对象不写泛型默认全部识别为Object多泛型标识需要一次性全部指定或全部省略。四集合工具类Collections1. 定位专门操作Collection、List、Set集合的工具类内部全部静态方法无需创建对象直接类名调用。2. 高频静态方法◦ reverse(List list)反转List集合内元素存储顺序◦ shuffle(List list)打乱List集合元素顺序实现随机排列◦ sort(List list)对集合内元素进行升序排序3. 排序配套两种比较器1. 内置比较器Comparable需要存储的实体类实现该接口重写compareTo方法在实体类内部定义排序规则返回正数、负数、0区分大小。2. 外置比较器Comparator无需修改实体类排序时通过匿名内部类单独定义比较规则灵活切换多种排序逻辑。面试拓展题区分Collection接口与Collections工具类解析Collection是单列集合顶层父接口定义集合通用规范Collections是静态工具类提供操作集合的各类工具方法。五子接口二Set不可重复集合1. 核心特性无序存储、无下标索引、集合内元素不允许存储重复内容2. 方法体系完全继承Collection接口全部方法没有拓展下标相关方法3. 主流实现类1. HashSet开发、面试双重重点自定义对象存入HashSet去重规则必须重写实体类hashCode()与equals()两个方法。◦ hashCode重写规则相同属性对象返回一致哈希值不同属性尽量返回不同哈希值常规做法把所有成员变量哈希值相加返回。◦ equals重写规则两个对象所有属性全部相等时返回true判定为重复元素。HashSet去重底层流程存入对象先计算哈希值定位存储槽位槽位无元素直接存入槽位已有元素则调用equals对比全部属性相等则拒绝存入不相等则追加存储。2. LinkedHashSetHashSet子类底层链表哈希表保留元素添加顺序同时保证元素不重复自定义对象存储同样需要重写hashCode与equals。3. TreeSetSortedSet接口实现类自带自动排序自定义对象存储需要实现Comparable接口重写compareTo返回值为0判定为重复对象。4. Set遍历方式仅支持增强for循环、迭代器两种遍历无下标无法使用普通for循环。三、Map双列集合体系一Map核心特性1. 存储单位为键值对keyvalue一个集合元素包含两个对象2. 键key无序、无下标、全局唯一不允许重复3. 值value无序、无下标允许存入重复数据二Map通用核心方法• put(K key,V value)添加/修改键值对键不存在直接新增键已存在则覆盖旧值返回被覆盖的旧value开发高频方法• remove(K key)根据指定键删除整条键值对返回被删除的value• get(K key)根据键查询对应valueMap读取数据核心方法• containsKey(K key)判断集合是否存在指定key• containsValue(V value)判断集合是否存在指定value• size()获取当前集合键值对总数量三Map五大实现类1. HashMap开发核心重点JDK1.2推出线程不安全运行效率高key与value都允许存入null自定义对象作为key时实体类必须重写hashCode和equals保证键唯一业务中一般使用String、Integer作为key。2. HashtableJDK1.1早期类所有方法加同步锁多线程安全运行速度慢key、value都不允许存入null开发基本淘汰。面试拓展题HashMap与Hashtable完整区别3. PropertiesHashtable子类强制要求key和value只能是String字符串项目中常用来读取配置文件。4. LinkedHashMapHashMap子类底层链表维护存储顺序遍历顺序和添加顺序保持一致。5. TreeMapSortedMap接口实现类会根据key自动排序自定义对象作为key需要实现Comparable接口。四Map三种遍历方式1. 键遍历开发最常用通过keySet()获取全部key组成Set集合再遍历key搭配get方法读取对应valueSetK keySet map.keySet();for(K key : keySet){V value map.get(key);}2. 值遍历通过values()获取全部value组成Collection集合仅能操作值无法获取对应keyCollectionV values map.values();for(V v : values){}3. 键值对整体遍历通过entrySet()把每一组键值对封装为Map.Entry对象存入Set通过Entry的getKey()、getValue()直接获取键和值效率高于键遍历SetMap.EntryK,V entrySet map.entrySet();for(Map.EntryK,V entry : entrySet){K k entry.getKey();V v entry.getValue();}