在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择
判断存储的类型(一组对象或一组键值对):
一组对象:「Collection」接口
-
允许重复:List
- 增删多:LinkedList 【底层维护了一个双向链表】
- 改查多:ArrayList 【底层维护 Object类型的可变数组】
-
不允许重复:Set
- 无序:HashSet 【维护了一个哈希表 即(数组+单链表)】
- 插入和取出顺序一致:LinkedHashSet 【双向链表】
- 排序:TreeSet 【可以指定排序规则】
- 无序:HashSet 【维护了一个哈希表 即(数组+单链表)】
一组键值对:「Map」接口
- 键无序:HashMap 【底层是:哈希表 jdk7:数组+链表,jdk8: 数组+链表(红黑树)】
- 键插入和取出顺序一致:LinkedHashMap
- 键无序:HashTable【与HashMap相比:键和值都不能为「null」,线程安全】
- 读取文件 Properties
- 键排序:TreeMap 【可以指定排序规则】
看到array:就要想到数组,就要想到查询快,有角标
看到link:就要想到链表,就要想到增删快,就要想要frist last
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要重写hashcode方法和equals方法。
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。
集合类底层:
List:
- ArrayList:数组
- Vector:数组
- LinkedList:链表,双向链表
- Stack:是Vector的子类,数组
Set:
- HashSet:HashMap
- TreeSet:TreeMap
- LinkedHashSet:LinkedHashMap
Map:
-
HashMap:
- JDK1.7:数组+链表
- JDK1.8:数组+链表/红黑树
-
TreeMap:红黑树
-
LinkedHashMap:是HashMap的子类,和HashMap一样,比HashMap还要多维护添加的顺序,它的结点类型中多一个next、pre
数组的特点:
优势:
- 根据索引可以快速定位,如果没有索引信息,还是按顺序查找,效率不见得高。
缺点:
-
创建一个数组必须指定大小,大小一旦确定就不能变,如果要变,就要重新创建数组
所以,ArrayList、Vector、HashMap等这些底层和数组有关的,都设计到扩容问题。
-
数组如果在「中间」要删除元素或插入元素,就要移动后面元素
链表的特点:
优势:
- 不需要提前创建数组空间等,来一个元素,new一个结点对象。所以没有扩容问题。
- 链表如果在「中间」要删除元素,插入元素,不需要移动元素,只要修改前后元素的next,pre的引用关系
缺点:
- 如果你要根据索引操作,或没有索引操作,都是要从头head,或尾last去查找。