集合(java SE中比较重要的一点)
集合:相同类型的归类,放到一个容器里面
集合和数组相似点
都可以存储多个对象,对外作为一个整体存在
数组的缺点
长度必须在初始化的时候固定
采用连续存储空间,删除和添加效率低下
数组无法直接保存映射关系
数组缺乏封装,操作繁琐
集合简图
虚线是接口,实线是类
集合架构
Collection接口存储一组不唯一,无序的对象
List接口存储一组不唯一,有序(索引顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供Key到Value的映射
Key 唯一 无序
Value 不唯一 无序
List集合
List集合的主要实现类有ArrayList和LinkedList,分别是数据结构中顺序表和链表的实现。另外还包括栈和队列的实现类:Deque和Queue
ArrayList
在内存中分配连续的空间,实现了长度可变的数组
优点:遍历元素和随机访问元素的效率比较高
缺点:添加和删除需大量移动元素效率低,按照内容查询效率低
LinkedList
采用双向链表存储方式
缺点:遍历和随机访问元素效率低下
优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可,如果插入删除发生在头尾可以减少查询次数)
//集合中只能放引用数据类型
//数组中可以放基本数据类型,还可以存放引用数据类型
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包
List泛型的使用
arraylist
缺点:添加元素是可以加入任何类型的,不安全
获取元素的时候需要进行强制类型转换,繁琐
为了简单还有安全
引入泛型:generic
ArrayList 源码解读
//接口可以是一个方法也不提供的,比如RandomAccess,Cloneable
JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10,
JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0,
第一次添加元素,容量不足就要进行扩容,默认增长50%
快捷键从源码回到原界面:ctrl+alt+左箭头
ArrayList中提供了一个内部类Itr,实现了Iterator接口,实现对集合的遍历
LinkedList双链表
Users\我是一只小馋猪\AppData\Roaming\Typora\typora-user-images\image-20221012201745988.png)
将ArrayList替换为LinkedList之后,不变的是什么?
1.后续操作代码没有变
2.执行结果没有变
变的是:
1.底层的数据结构发生了变化,数组----->双向链表
2.具体的操作方式发生了变化
LinkedList可以作为线性表,栈或者队列来使用
//实际开发中更多的是面向接口编程
什么时候使用ArrayList,什么时候使用LinkedList
ArrayList:按照索引随机访问,遍历集合
LinkedList:需要的添加,删除操作多的时候使用LinkedList