01 集合体系的介绍
【1】什么是集合:集合就是存放数据的容器,Java根据不同的业务场景提供给了我们很多具有不同特点的集合。
【2】集合的分类:① 以Collection为例的单列集合 ② 以Map为列的双列集合。
【3】单列集合的特点:每个元素只会存储一个数据。
【4】双列集合的特点:每个元素会存储两个数据(键值对)。
02 Collection单列集合
02_01 Collection体系
【1】Collection是一个泛型接口,这个接口只规定了一些基本的特点,增删查改。
【2】Collection有很多的子接口,其中List和Set这两个是我们着重要学的。
【3】List系列集合的特点:有序,可重复,有索引。(有序是指输入和输出的顺序是一致的)
ArrayList和LinkedList实现类的特点:同上。
【4】Set系列集合的特点:无序,不重复,无索引。
HashSet:同上。
LinkedHashSet:有序,不重复,无索引。
TreeSet:按照元素大小默认升序排序,不重复,无索引。
02_02 Collection常用方法
【说明】:对于toArray()方法,如果非要用类似Stirng[]的变量接返回值,则书写格式为:
String[] a = list.toArray(new String[list.size()]);
提示:Object[]和String[]等类似的写法是不具备父子关系的。
02_03 Collection遍历方式
02_03_01 迭代器遍历
【1】介绍:迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator
【2】遍历步骤:使用集合对象调用iterator方法,得到一个Iterator对象,然后使用Iterator对象调用hasNext,next方法配合遍历。
【3】说明:迭代器对象一旦拿到它会指向集合中第一个元素,hasNext方法用于判断当前位时是否有元素存在,next方法用于返回迭代器对象当前所指向的元素,并更新指向位置指向下一个。
【4】使用迭代器遍历时只能判断一次获取一次,否则会出bug。
【5】迭代器越界会出现:NoSuchElementException。
02_03_02 增强for
【1】介绍:增强for循环可以遍历集合,也可以遍历数组,本质其实也是使用迭代器进行遍历。
02_03_03 lambda表达式
【1】介绍:lambda是JDK8开始新增的一个语法,Java通过通过结合lambda表达式提供了一种更简单,直观的方式来遍历集合。
【2】遍历步骤:使用集合对象调用forEach方法,forEach方法的参数是一个Consumer函数式接口对象 ... 具体见下图:
02_03_04 补充:集合中存储的是元素的什么信息
答:集合中存储的是元素的地址信息。
02_04 List系列集合
02_04_01 特点,特有方法
02_04_02 遍历方式
02_04_03 ArrayList集合的底层原理和应用场景
【1】特点:
① 基于数组实现。
② 根据索引的查询速度快。
③ 删除添加数据效率低。
【2】ArrayList集合的应用场景:
① 适合:经常需要根据索引查询数据;数据量少
② 不适合:数据量大且经常进行增删操作。
02_04_04 LinkedList集合的底层原理和应用场景
【1】链表:链表是由一个个节点组成的,每个节点里分为数值域和指针域。
【2】链表的特点:每次根据索引查询时都要从头遍历,所以查询效率低;
由于增删操作并不涉及到数据的大范围移动所以相对数组增删数据的效率较快。
【3】LinkedList底层是双向链表,根据索引的查询速度要比单链表的快,因为在查询之前可以根据索引大小判断从哪一头开始查找更快;
增删数据的效率相对数组来说也是相对较快的,
对于首尾元素增删查改的效率非常高。
【应用场景】:
02_05 Set系列集合
02_05_01 特点
02_05_02 HashSet集合的底层原理
【说明】:扩容时会进行二倍扩容。
【说明】:哈希表中的红黑树大小是根据哈希值的大小排的。
02_05_03 LinkedHashSet集合的底层原理
02_05_04 TreeSet集合
【说明】:
① 我们在TreeSet集合中放的是自定义类型的对象,在使用比较器比较时,如果比较的结果相等则会直接认为是重复元素。
② 当我们既实现了Comparable接口,又实现了CompareTo接口,会选择CompareTo中的比较规则进行排序。
02_06 应用场景总结
02_07 集合的并发修改异常问题
02_08 可变参数
02_09 Collections工具类
【注意】:Collections工具类的shuffle,sort方法只能传List系列的集合!!!