什么是容器?
乍一听,好难、好深奥的玩意
“容器”其实就是一种用来存储数据的数据结构
就是平时我们用来放数据的一些集合(set)、列表(list)、映射(map),姑且叫它们容器类,集合类
为什么用容器?
我们都知道数组的长度是固定,而且数组存放的数据类型是一样的,所以容器就解决了这两个弊端
容器类
ArrayList:底层是基于动态数组,它是按顺序存数据,它向尾部放数据效率高,根据下标随机访问数组元素的效率高。
LinkedList:基于链表的动态数组、通过一个双向链表来实现的,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。
HashSet:无序的,不可重复的;允许存放null值;底层封装HashMap;实现是不同步的,线程不安全;
要想在hashSet集合中实现元素存取的唯一性,由于底层判断依赖于equals和hashCode方法,故所存取的元素需要重写这两个方法,以按照我们的期待存取元素。保证元素唯一性
HashMap:通过键值对映射,非线程安全的,速度快,是一个散列桶,有ArrayList和LinkedList所有优点,可以放null 值
容器的扩容
容器都会自动扩容
ArrayList:初始化大小是 10
扩容机制:容量用完了自动扩容到1.5倍
LinkedList:没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好
HashMap:初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子)
扩容机制:当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍。例如:初始大小为 16 ,扩容因子 0.75 ,当容量为12的时候,比例已经是0.75 。触发扩容,扩容后的大小为 32
HashSet:底层即HashMap,所以初始大小,扩容机制和HashMap一样
LinkedList和ArrayList
为什么LinkedList比ArrayList增加删除快
因为ArrayList存数据是:数组+数据 数组即它的下标,所以它增加删除时, 要对数组进行复制的操作,特别根据位置添加删除这种操作,想想是不是都觉得复杂
而LinkedList就是插队,而且它有一个特性,就是它会判断你给的位置是在前半段,还是后半段。然后决定从前面操作,还是从后面开始操作
为什么ArrayList比LinkedList查询快
因为ArrayList有下标,可以根据下标直接拿到值,而LinkedList没有下标,只能通过遍历链表来拿到第index个数据
至于尾部添加,LinkedList 存数据是new 一个Node对象,所以当ArrayList没有触发扩容时要快些