java容器的主要分类
- Collection接口存储一组不唯一,无序的对象
- List接口存储一组不唯一,有序(索引顺序)的对象
- Set接口存储一组唯一,无序的对象
- Map接口存储一组键值对象,提供key到value的映射
- key唯一无序
- value不唯一无序
List
- 特点:有序,不唯一(可重复)
- ArrayList:线性表中的顺序表
- 在内存中分配连续的空间,实现了长度可变的数组
- 优点:遍历元素和随机访问元素的效率高
- 缺点:添加和删除需大量移动元素,效率低,按照内容查询效率低
- add(index, element):需要大量的后移元素,效率低下
- LinkedList:线性表中双向链表
- 采用双向链表存储方式
- 缺点:遍历和随机访问元素效率低下
- 优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才行。如果插入删除发生在头尾可以减少查询次数)
- add(index, element):创建新的节点储存 element,并修改前后两个节点的指针。效率比较高。
- 到底该使用 ArrayList 还是 LinkedList
- 随机访问频率高,建议使用 ArrayList
- 添加、删除操作比较多,建议使用 LinkedList
Set
- 特点:无序、唯一(不重复)
- HashSet
- 采用哈希表存储结构
- 优点:添加速度快、查询速度快、删除速度快
- 缺点:无序
- LinkedHashSet
- 采用哈希表存储结构,同时使用链表维护次序
- 有序(添加顺序)
- TreeSet
- 采用二叉树(红黑树)的存储结构
- 二叉树:两个叉
- 二叉排序树:左子树 < 根 < 右子树
- 二叉平衡树:首先是一个二叉排序树,并且左右子树的高度差是 0,1,-1
- 优点:有序(大小顺序),查询速度比 List 快(按照内容查询)
- 缺点:查询速度没有 HashSet 快
- 采用二叉树(红黑树)的存储结构
按照内容查询速度的快慢(由慢到快排序)
- 线性表
- 树
- 哈希表