Day18 03.19 下 集合框架 ArrayList LinkedList

集合框架

Day18 03.19 下 集合框架 ArrayList LinkedList_第1张图片
Day18 03.19 下 集合框架 ArrayList LinkedList_第2张图片

基本概念((面试频率很高的哦))

集合框架出现是为了解决数组在开发过程中所遇到的问题
特点:
1、长度不是固定、可以随时扩容
2、存放不同类型的数据
3、提供很多种集合,不同的算法,采用不同的集合框架可以提高开发效率

集合的结构

Day18 03.19 下 集合框架 ArrayList LinkedList_第3张图片

虚线表示接口
实线是类
左边 集合框架 Iterator迭代器
map框架

图需要完整地背下来
Day18 03.19 下 集合框架 ArrayList LinkedList_第4张图片
面试题 两者有什么区别?
Collection:提供了集合框架的基本特征
Collections:提供了操作集合框架的各种方法

Collection

Collection是一个接口,不提供直接的实现,List、set这两个子接口都是继承与Collection,代表的是一种规则,它所包含的元素必须遵循一条或者多条规则,比如:有些允许数据重复,有些又不允许数据重复,有些数据有顺序,有些数据又没有顺序。
在实际开发中,一般不使用Collection来开发,使用它的子接口进行开发

List

List接口 ,是Collection直接的子接口,List代表的是有序的collection,list采用某种特定的插入顺序来保证里面的数据都是顺序的。用户可以对list中存放的数据根据位置来进行精确的控制,同时可以根据元素的索引来获取到元素的内容
特点:
1、list中的元素是有顺序的
2、list允许元素的重复出现
3、list可以支持null数据
4、可以使用索引来获取list中的元素

ArrayList

ArrayList是一个动态数组,最常用最常见的集合,允许任何符合规则的元素插入,包括null也可以插入,ArrayList底层是数组,但这个数组可以进行动态扩容的,底层默认初始化的容量10,该容量代表数组的大小,随着集合中元素的内容不断增加,容器的大小也会随着变化,每次向容器中加入数据的时候都要去检测当前容量是否够用,当快要溢出的时候,进行扩容。但是扩容效率比较低。
扩容:创建一个新的数组,将以前的数据复制到新的数组,将以前数组废弃。创建一个ArrayList
自动装箱功能
add方法
list。add(2,“数据”);
向集合第三个数据中加入数据,其他数据后移
Day18 03.19 下 集合框架 ArrayList LinkedList_第5张图片
获取数据,get指定输出 foreach输出所有
Day18 03.19 下 集合框架 ArrayList LinkedList_第6张图片

删除集合中的数据
list。remove
根据下标来删除
根据对象的地址删除
在这里插入图片描述
修改集合框架中的数据
list。set(2,“数据”)
在这里插入图片描述

集合中是否有学生对象
list。contains
在这里插入图片描述
length方法 字符串长度
数组长度 length属性

集合的长度
list。size

LindedList

ArrayList和LinkedList都是实现了List接口,ArrayList是一个动态数组,底层是一个双向链表,Linkedlist除了有ArrayList的一些方法以外,提供额外的一些方法,通过一些方法操作链表的头和尾
由于两种集合底层数据结构不同,linkedlist不能随机访问,所有的操作都是按照双向列表来执行,在列表中索引会采用从头或者结尾来遍历数据,这样做的目的是在操作集合的时候删除,增加可以提高效率

双向列表:
列表中的每个元素都是独立的,每个空间都存放本身的数据,以及上一个对象的引用和下一个对象的引用(索引)。

linkedlist集合对象
在这里插入图片描述
添加数据
list。add
在末尾添加
list。add(,)
指定位置添加
Day18 03.19 下 集合框架 ArrayList LinkedList_第7张图片
获取数据
list。get();
list。element();
list。getfirst();
list。getlast();
Day18 03.19 下 集合框架 ArrayList LinkedList_第8张图片
修改数据
在这里插入图片描述
删除数据
list。remove (index)list提供的方法
在这里插入图片描述

Day18 03.19 下 集合框架 ArrayList LinkedList_第9张图片

Vector

同步 synchronized
在这里插入图片描述

与Arraylist很相似,底层都是动态数组,但是Vector是线程同步的,在操作数据的方法上面加上了synchronized关键字 是线程安全的。1.0就开发出来vector,jdk1.2后才开始提出集合框架,有很多程序还是用vector来完成的,为了向后兼容,将vector放在list下面,保留以前vector的特性,但是现在一般都用ArrayList。
效率比ArrayList低。

说一下三种集合框架的优缺点

1、ArrayList底层是一个动态数组,LinkedList底层是双向链表来实现的
2、对于随机访问数据,get、set ArrayList效率比LinkedList的效率高,因为ArrayList底层是一个动态数组,查找元素在一个连续的空间找,速度飞快。LinkedList移动指针(索引)去判断当前元素下一个是否是我们需要的。
3、ArrayList结构对数据进行增删效率比较低,中间插入一个元素,以后所有的元素都要挪动位置,下标都得变化。LinkedList前一个元素只需要改变引用,后一个只需要改变引用
4、vector线程安全,效率非常低。
5、ArrayList扩容的效率比较低,你提前能确定空间,优先使用构造器初始化数组容量

ArrayList源码解析:
当你调用add方法的时候,检查数组是否够用,如果不够用将创建一个容器大一倍的数组,将原来的数组的数据拷贝到新数组中,再将原来的数组废弃。
当你调用remove方法的时候,将指定元素移除数组后,将后面的元素整体向前移动,system.copyof()来实现的,一个删除会有多个元素移动,add添加的时候,添加到指定位置也会整体移动。

LinkedList源码解析:
LinkedList基于链表的数据结构 每个元素都包含了上一个和下一个元素的引用,所以add/remove只会影响到上一个和下一个元素
链表结构:
单链表:单链表中链表对象维护了一个first引用,该引用指向节点链表中的第一个节点元素,每个节点对象维护了一个next引用,next指向下一个元素引用,(节点对象:自己的数据,下一个元素的引用node)
()Day18 03.19 下 集合框架 ArrayList LinkedList_第10张图片

双向链表:
链表对象维护了一个first引用和last引用,这两个引用分别指向链表的首和尾,每个节点对象维护了对象的数据,prev、next引用,用来指向前后节点对象。
next引用指向后一个data,prev指向前一个next,指向后一个data
Day18 03.19 下 集合框架 ArrayList LinkedList_第11张图片

你可能感兴趣的:(Day18 03.19 下 集合框架 ArrayList LinkedList)