数组(可以存储基本数据类型)是用来存现对象的一种容器 但是数组的长度固定 不适合在对象数量未知的情况下使用
集合(只能存储对象,对象类型可以不一样)的长度可变 可在多数情况下使用
实线边框的是实现类 折线边框的是抽象类 点线边框的是接口
Collection接口是集合类的根接口 Java中没有提供这个接口的直接的实现类 但却让其被继承产生了两个接口 Set和List
Set中不能包含重复的元素
List是一个有序的集合 可以包含重复的元素 提供了按索引访问的方式
Map是Java.util包中的另一个接口 它和Collection接口相互独立 但是都属于集合类的一部分
Map包含了键值对(key-value)
Map不能包含重复的key 但可以包含相同的value
所有的集合类都实现了Iterator接口 这是一个用于遍历集合中元素的接口 主要包含以下方法:
1.hasNext()是否还有下一个元素
2.next()返回下一个元素
3.remove()删除当前元素
ArrayList 与 LinkedList 之间的区别
数组和链表在CURD上的区别
1.ArrayList是实现了动态数组的数据结构 LinkedList基于链表的数据结构
2.对于随机访问 get set ArrayList绝对优于LinkedList
3.对于新增和删除操作 add 和 remove LinkedList比较占优势
ArrayList数组默认长度为10 扩容1.5倍
add() 尾部添加 remove(index)(E element)
LinkList双链表(不带头结点) add() 尾插
数组和ArrayList之间的区别
1.数组大小不能改变 ArrayList实现扩容缩容操作
2.数组类型可以为基本数据类型或引用数据类型
ArrayList只能为引用数据类型
ArrayList和Vector的区别
初始化大小 | 是否用于多线程 | 扩容 | |
ArrayList | 10 | 是 | 1.5倍 oldCapacity+oldCapacity>>1 |
Vector | 10 | 否 | 2倍 oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); |
Map
Map 提供了一种映射关系 其中的元素是以键值对(key-value)的形式存储的 能够实现根据key快速查找value(键不能重复)
HashMap
1.HashMap是Map的一个重要实现类 也是最常用的 基于哈希表实现
哈希算法
根据设定的哈希函数和处理冲突方法将一组关键字映象到一个有限的地址区间上的算法
哈希表
数据经过哈希算法之后得到的集合
由此方法可以确定关键字和数据在集合中的位置存在一定的关系 易于快速查询
哈希冲突
哈希算法被计算的数据是无限的 而计算后的结果范围有限 导致不同的数据经过计算后得到相同的值 即哈希冲突。
解决哈希冲突的方式
线性探测法、连地址法、建立公共溢出区等
HashMap使用的链地址法
加载因子
加载因子越大 填满的元素就越多 空间利用率高 但冲突的机会加大 查找效率变低(因为链表变长了)
加载因子越小 填满的元素就越少 空间利用率低 冲突的机会减小 查找效率高(链表不长) 很多空间还没有利用就开始扩容 频繁扩容导致耗费性
推荐链接 :https://www.jianshu.com/p/dff8f4641814
HashMap和HashTable的区别
HashMap适用于单线程 允许存在一个为null的key 多个为null的value
HashTable适用于多线程 值不能为空 键不能为空
LinkedHashMap
保存插入顺序 在利用 Iterator遍历LinkedHashMap时 先得到的先插入
速度慢 LinkedHashMap的遍历速度只与实际数据有关 与容量无关
HashMap的遍历速度与容量有关
参考链接