一、基本概念
java容器类库的用途是“保存对象”,并将其划分为两个不同的概念:
1、Collection
一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
2、Map
一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字典”,因为你可以使用键对象来查找值对象。
二、java提供了大量持有对象的方式
(1)数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对结果做类型转换。它可以是多维的,可以保存基本类型的四。但是,数组一旦生成,其容量就不能改变。
(2)Collection保存单一的元素,而Map保存相关联的键值对。有了java的泛型,你就可以指定容器中存放的对象类型,因此,你就不会将错误类型的对象放置到容器中,并且在从容器中获取元素时,不必进行类型转换。各种Collection和各种Map都可以在你向其中添加更多的元素时,自动调整尺寸。容器不能持有基本类型,但是自动包装机制会仔细执行基本类型到容器中所持有的包装器类型之间的双向转换。
(3)像数组一样,List也建立数字索引与对象的关联,因此,数组和List都是排好序的容器。List能够自动扩充容器。
(4)如果要进行大量的随机访问,就是用ArrayList;如果要经常从表中间插入或删除元素,则应该使用LinkedList。
(5)各种Queue以及栈的行为,由LinkedList提供支持。
(6)Map是一种将对象(而非数字)与对象关联的设计。HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。
(7)Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。
(8)新程序中不应该使用过时的Vector、HashTable和Stack。
三
、Set和存储顺序
当你在创建自己的类型时,要意识到Set需要一种方式来维护存储顺序,而存储顺序如何维护,在Set的不同实现之间会有所变化。因此,不同的Set实现不仅具有不同的行为,而且它们对于在特定的Set中放置的元素类型也有不同的要求。
Set(interface)
存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set和Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet
为快速查找而设定的Set。存入HashSet的元素必须定义hashCode()。
TreeSet
保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口。
LinkedHashSet
具有HashSet的查询速度。且内部使用链表维护元素顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。元素也必须定义hashCode()方法。