分类:
2008-09-10 10:08:44
在中,容器主要包括:数组(Array)、集合(Collection)和映射(Map)三种。
(1)数组Array:将数字与元素联系起来,其中的元素都具有相同的数据类型,只能通过下标来访问其元素;数组可以是一维的,也可以是多维的;数组一旦生成,其容量就不能改变。数组是一种复合数据类型,在中,除了可以像“int[] array;”来声明和表示一个数组,还可以用Array类来表示一个数组,同样地,JDK类库还提供了Arrays类类操作数组,该类定义了对数组进行操作的各种方法(赋值、排序、搜索、比较、查找元素等)。
(2)集合Collection:是一个接口类,包括List、Set、Queue等子接口,其具体的实现类可以用来保存多个元素。这里只讨论常用的子接口List和Set的常用实现类。常用的List实现类有ArrayList、Vector和LinkedList等,常用的Set实现类有HashSet、LinkedHashSet和TreeSet等。需要注意的是,List和Set有着很大的不同,主要包括是否允许元素重复和是否维护元素的次序。
(3)映射Map:保存相关联的键值对。其具体的实现类可以将键映射到值,根据键得到值,因此,一个映射不能包含重复的键,但是允许有重复的值,每个键最多只能映射到一个值。 常见的Map实现类有HashMap、Hashtable、LinkedHashMap和TreeMap等。
为了讨论的方便,下面以Array,List、Set、Map为分类来讨论这几种容器的使用特点。
(1)Array:数组的使用很直接,主要是根据下表来获取其元素。其特点就是一旦生成,其容量不能改变,并且每个元素之间不允许有“空隙”。其使用实例可以参考电子工业出版社“宝典”系列之《Java JDK 实例宝典》(夏先波 编著),个人感觉这本书写得不错,给出了许多JDK类库的具体使用实例,代码的注释也比较详细,很适合初学者入门学习使用,如果看Java Doc 还是有不明白的地方,也可以参考此书:)
(2)List:可用来存放多个元素,能够自动扩充容量,能够维护元素的次序,并且允许元素重复。
(2.1)ArrayList类:最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速的随机访问,但是要从ArrayList的中间位置插入或者删除 元素时,需要对数组进行复制、移动,代价比较高,因此,ArrayList适合随机查找和遍历,不适合插入和删除。
(2.2)Vector类:同ArrayList一样,其内部也是通过数组实现的,不同的是,Vector支持线程的同步,能够避免多线程同时写而引起的不一致,但是实现线程的同步需要很高的代价,因此访问Vector比ArrayList慢。
(2.3)LinkedList类:见其名,该类与链表肯定有关系:)该类的内部是通过链表来实现的,很适合数据的动态插入和删除,但是随即访问和遍历的速度比较慢。此外,该类还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
(3)Set:可用来存放多个元素,但是不允许元素重复(即不保存重复元素),也不能够维护元素的次序。很直观,联想一下数学中的集合的概念就很好理解了。此外,需要注意的是,加入Set的元素必须定义equals()方法以确保对象的唯一性,如String对象。
(3.1) HashSet类:采用散列函数对元素进行排序,是专门为快速查询而设计的存入HashSet的对象必须定义hashCode()方法。
(3.2)TreeSet类:采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序的序列。
(3.3) LinkedHashSet类:内部使用散列以加快查询速度,同时使用链表维护元素的插入次序,在使用迭代器遍历时,会按插入次序显示结果。
(4)Map:可以用来存放相关联的键值对,根据键得到值。常见的Map实现类有HashMap、Hashtable、LinkedHashMap和TreeMap.
(4.1)HashMap类:一个最常用的Map,它根据键的hashCode值数据,根据键可以直接获取它的值,具有很快的访问速度,但不支持线程同步。HashMap最多允许一条记录的键为null,但是允许多条记录的值为null.
(4.2)Hashtable类:与HashMap类似,但是它不允许记录的键或者值为null,支持线程同步,因而Hashtable在写入数据时会很慢。
(4.3)LinkedHashMap类:保存了记录的插入顺序,在用Iterator遍历它时,先得到的记录肯定时先插入的,在遍历的时候比HashMap慢。
(4.4)TreeMap类:能够把它保存的记录根据键排序,默认为升序排列。当用Iterator遍历它时,得到的记录是排过序的记录。