Java的List、Set、Map三大集合
List、Set、Map三大集合,基本上是面试必被问到的东西,关于Java中JCF的东西是面试当中的一个大点,如果正在面试的话,建议还是认真学习一下JCF相关的东西。
一、List
List是数据集合,是有序的,可以重复的集合,List主要有三个实现类,分别是ArrayList,LinkedList,vector
我们分别介绍一下:
1、ArrayList
- 不支持同步
- 以数组作为底层原理实现
- 利用索引定位,可以快速查询,适合变动不大,用于查询的数据
- 基于数组实现,不适合指定位置的插入、删除;尾部插入删除的效率和LinkedList差不多,可能ArrayList差一些;
- 在开始定义的内存大小满之后,会自动扩容1.5倍;开始定义的长度默认是10,具体的扩容方式可以研究一下源码(这里我还没有去看,后面看了会做补充)
2、LinkedList - 不支持同步
- 以双向链表作为原理实现(关于双向链表可以查看数据结构)
- 可被当作堆栈、队列和双端队列进行操作
- 顺序访问高效,随机访问较差;中间插入和删除高效
- 适用于经常变化的数据
3、Vector - 和ArrayList类似,但适用于多线程,是同步列表
这是List集合的一个类结构图
从上图可以看到
1、都实现了collection接口,Vector和ArrayList是通过实现List接口间接实现的
2、都是AbstractList的子类
3、LinkedList没实现RandomAccess,而Vector和ArrayList实现了
二、Set
Set和List都继承了collection,也是一个集合
-确定性:对于任意元素都可以判断是否在集合中
-互异性:互译,不能存放相同的
-无序性
主要实现:
-HashSet:基于散列函数,无序,不支持同步
-TreeSet:基于树结构,可排序,不支持同步
-LinkedHashSet:基于散列函数和双向链表,可排序,不支持同步
需要注意的是:
HashSet的构造函数是new了一个HashMap() ,这里我也提出一个问题,set构造了一个Map来存储元素,是为什么?
下面分别说一下Set的几个实现类:
1、HashSet
- 可以为空
- 不支持同步
2、LinkedHashSet - LinkedHashSet是hashSet的子类
- 可以为null
- 不支持同步
3、TreeSet - 不允许有null元素
- 不支持同步
- 默认从小到大排序
注:添加到TreeSet的元素必须实现Comparator
这是Set集合的一个类结构图
从上图可以看到
1、HashSet和TreeSet都实现了AbstractSet,LinkedHashSet是HashSet的子类
2、AbstractSet的父类是AbstractCollection,和AbstractList是一个父类
3、AbstractSet实现了set,所以HashSet和TreeSet也都实现了set
三、Map:映射
-两个集合之间的元素对应关系
-一个输入对应一个输出
-键值对 k-v
主要实现:
-HashMap:不同步,快,数据量大
-HashTable:同步,慢,数据量小
-Proporties:同步,文件形式,数据量小
关于Map的几个实现:
1、HashMap
- K-V对,K,V均可为null
- 不同步,多线程不安全;
- 无序
2、HashTable - K-V对,K和V都不可以为null
- 同步,多线程安全
- 无序,适合小数据量
3、LinkedHashMap - 基于双向链表实现,维持插入顺序
- 有序
4、TreeMap - 基于红黑树的Map,可以根据key的自然排序或compareTo进行排序
- 有序
5、Properties - 继承于HashTable
- 可以将k-v对存放在文件中
- 适用于数据量少的配置文件
- load()从文件加载内容;store()写入到文件
- 获取属性getPropetry();设置属性setPropetry()
Map的类结构图
基于上述,我大概总结了个类关系图
可以看出map是和conllection没有关系的。
以上仅为个人总结,难免有些有问题的地方,还请提出,我来改进就好,谢谢阅读。