对每个接口都用同一套模板来进行回答。
即从主要功能、特征、实现三个方法面
Set接口
Set接口拓展了Collection接口,是最简单的一种集合。
主要功能:
存入Set中的元素都必须是唯一的,不含有重复元素,加入Set的元素都会经过equals的方法确认对象的唯一性。
特性:
- 只允许存放一个null元素
- Set是一个无序的容器,无法保证元素的存储顺序。
实现:
Set接口主要的两个实现是HashSet和TreeSet。其中TreeSet还是实现了SortedSet接口,可以根据compare来对容器进行排序。
List接口
List接口也拓展了Collection接口,也可以叫有序集合。
主要功能:
- 精确控制元素的插入位置
- 通过索引访问元素
- 搜索列表中的元素。
特性:
- 集合中可以存储重复的元素,包括null值
- 是有一个有序的容器,线性方式存储元素,输出顺序即插入顺序
实现:
List接口常用的实现有三个,分别是ArrayList、LinkedList和Vector。
ArrayList用数组实现,可以使用索引随机访问。
LinkedList用链表实现,更适合用在随机位置插入。
vector是ArrayList的线程安全版本。
Map接口
Map接口不是从Collection接口扩展的,他也叫映射表,每一个元素都有一个键对象和值对象,
主要功能:
只要给出键对象就会返回对应的值对象。
特性:
- 可以有相同的值对象,但是键对象一定是独一无二的。
- 同理,null值只能有一个键,值对象可以有无数个null。
实现:
Map接口比较实用的三个实现分别是HashMap、Hashtable、TreeMap。
其中TreeMap是基于“红黑树”数据结构来实现的,查看键值对的时候他们会被排序。
Hashtable是HashMap的线程安全实现版本。
总结
如果想要经常按照索引访问元素,就使用ArrayList。
如果要经常性地插入元素,那要使用LinkedList。
如果要保证插入元素的唯一性,就要选择一个Set的实现类。
如果要以键值对的形式保存元素,Map接口是最好的选择。