集合

  • 集合和数组都是容器

数组的特点

  • 数组定义完成并启动后,类型确定,长度固定
  • 在进行增删数据的时候,数组是不太合适的,增删数据都需要放弃原有数组或者移位
    集合是java种存储对象数据的一种容器

集合的特点

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
  • 集合非常适合做元素的增删操作。
  • 注意:集合种只能存储引用数据类型,如果要存储基本数据类型也可以选用包装类

集合的体系结构

  • Collection单列集合,每个元素只包含一个值
  • Map双列集合,每个元素包含两个值(键值对)

Collection集合体系

集合对于泛型的支持

  • 集合都支持泛型,可以在编译阶段约束集合只能操作某种数据类型
    注意:集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象

Collection集合的遍历方法

迭代器

  • 遍历就是一个一个的把容器种的元素访问一遍
  • 迭代器在java种代表的是Iterator,迭代器是集合专用的遍历方式

Collection集合获取迭代器

Iterator的常用方法

增强for循环(foreach)

格式

Lambda表达式遍历集合

Collection集合内存原理

常见数据结构

栈数据结构的执行特点

  • 后进先出,先进后出

队列

  • 先进先出,后进后出

数组

  • 数组是一种查询快,增删慢的模型

链表

单向链表

双向链表

二叉树

二叉查找树

平衡二叉树

红黑树

List集合特点

  • Arrays、LinekdList:有序,可重复,有索引
  • 有序:存储和取出的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复

List集合特有方法

  • List集合因为支持索引,所以多了很多索引操作的独特api,其他Collection的功能也都继承了

List的实现类的底层原理

  • ArrayList底层是基于数组实现的,查询元素快,增删相对慢
  • LinkedList底层基于双链表实现的,查询元素慢,增删首尾元素快

List集合的遍历方式有几种

  • 迭代器
  • 增强for循环
  • Lambda表达式
  • for循环(因为List集合存在索引)

LinkedList的特点

  • 底层数据结构是双链表,查询慢,首位操作极快,所以多了很多首位操作特有的api

LinkedList集合的特有功能

补充知识:集合的并发修改异常问题

  • 当我们从集合中找出某个元素并删除的时候可能会出现一种并发修改异常问题

哪些遍历存在问题

  • 迭代器遍历集合其直接用集合删除元素的时候可能出现
  • 增强for循环和lambda遍历集合且直接用集合删除元素的时候可能会出现异常
  • for循环可以通过从后向前遍历的方法避免此问题

Set系列集合特点

  • 无序:存储顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来索取数据

Set集合实现类特点

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:排序、不重复、无索引

HashSet底层原理

  • HashSet底层采用哈希表存储数据
  • 哈希表是一种对于增删改查数据性能都很好的结构

TreeSet底层原理

  • 底层基于红黑树实现排序,增删改查性能好

TreeSet集合自定义排序规则有几种

  • 2种
  • 类实现Comparable接口,重写比较规则
  • 集合自定义Comparator比较器对象,重写比较规则

Map集合概述和使用

  • Map集合是一种双列集合,每个元素包含两个数据。
  • Map集合的每个元素的格式:key=value(键值对元素)
  • Map集合也被称为“键值对集合”

Map集合体系特点

  • Map集合的特点都是由键决定的
  • Map集合的键是无序的,不重复的,无索引的,值不做要求(可以重复)
  • Map集合后面重复的键对应的值会覆盖前面重复键的值

Map集合实现类特点

  • HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
  • LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求
  • TreeMap:元素按照键是排序,不重复,无索引,值不做要求

Map集合常用api

Map集合的遍历方法

1. 键找值

  • 先获取Map集合全部键的Set集合
  • 遍历键的Set集合,然后通过键提取对应值

2.键值对

  • 先把Map集合转换成Set集合,Set集合中的每个元素都是键值对的实体类型了
  • 遍历Set集合,然后提取键值对以及提取值

3.Lambda