Java集合类的总结

时间:2021-04-03 16:59:24
集合类库考虑到“容纳自己对象”的问题,并将其分割成两个明确的概念:
1:集合(Collection):一组单独的元素。一个List(列表)必须按特定的顺序容纳元素,而一个Set(集)不可包含任何重复的元素。
2:映射(Map):一系列“键-值”对,如散列表身上的充分体现。Map可以和数组一样,扩充到多维,可以返回自己键的一个set,一个包含自己值的List或者包含自己"键值"对的一个List.
集合只有三个集合组件:Map,List,Set。而且每个组件实际只有两种或者三种的实现方式,通常只有一种特别好的方式。
一、collection
List和Set是从collection中继承过来的,collection中的方法在List以及set中都存在。
**List**借口中实现了ArryList以及LinkedList.List(借口),顺序是List最重要的特性,可以保证元素按照规定的顺序排列,同时它为Collection添加大量方法,以便我们在List中部插入和删除元素(只推荐对LinkedList这样做)。List也会生成一个ListIterator(列表反复器),利用它可在一个列表里朝两个方向遍历。
**ArrayList**是一个数组后推得到的List.作为一个常规用途的对象容器使用,替换了以前的Vector。允许我们快速访问元素,但在从列表中部插入和删除元素时,速度稍慢。
**LinkedList**提供优化的顺序访问性能,同时可以高效率地在列表中部进行插入和删除操作。但在进行随机访问时,速度相当慢。此时应该使用ArrayList()。
**set**拥有与Collection完全相同的接口,所以与两种不同的List不同,它没有什么额外的功能。相反,set完全就是一个CollectiOn,只是具有不同的行为。在这里,一个Set只允许每个对象存在一个实例。set(接口)添加到Set的每个元素都必须是独一无二的;否则就不会添加重复的元素。添加到Set的对象必须定义equals(),从而建立对象的唯一性性。一个Set不能保证自己可按任何特定的顺序维持自己的元素。
**HashSet**,用于除非常小的以外所有Set对象必须定义hashcode();
**ArraySet**由一个数组后推得到Set,面向非常小的Set设计,特鄙视那些频繁创建和删除的。
二、Map
**Map**(接口)通常包含HashMap与ArrayMap.
**HashMap** 基于一个散列表实现,用其代替Hashtable。针对“键值”对的插入和检索,这种形式具有最稳定性。
**ArrayMap**是一个ArrayList后推得到的Map.对反复的顺序提供了精确的控制。面向非常小的Map设计,特别是那些需要经常创建和删除的。对于非常小的Map,创建和反复所付出的代价要比HashMap设计低的多。但不适合大的Map.
三、如何进行合适的选择
List:首选ArrayList作为默认起点,若发现大量插入和删除造成性能的降低,再考虑换成LinkedList
set:首选HashSet,ArraySet基本用不到。
Map:常用HashMap。