Java集合类主要内容集合类概述Collection接口List接口-Vector类、ArrayList类、LinkedList类Set接口-HashSet类Map接口-HashMap类、TreeMap类Iterator(迭代器)集合类概述为容纳一组对象,最适宜的选择应当是数组。而且假如容纳的是一系列基本数据类型,更是必须采用数组。当我们编写程序时,通常并不能确切地知道最终需要多少个对象。有些时候甚至想用更复杂的方式来保存对象。为解决这个问题,Java提供了集合类库。使用Java集合的“缺点”是在将对象置入一个集合时丢失了类型信息。之所以会发生这种情况,是由于当初编写集合时,那个集合的程序员根本不知道用户到底想把什么类型置入集合。若指示某个集合只允许特定的类型,会妨碍它成为一个“常规用途”的工具,为用户带来麻烦。为解决这个问题,集合实际容纳的是类型为Object的一些对象的句柄。集合类概述新的集合库考虑到了“容纳自己对象”的问题,并将其分割成两个明确的概念:集合(Collection):一组单独的元素,通常应用了某种规则。在这里,一个List(列表)必须按特定的顺序容纳元素,而一个Set(集)不可包含任何重复的元素。映射(Map):一系列“键-值”对。从表面看,这似乎应该成为一个“键-值”对的“集合”,但假若试图按那种方式实现它,就会发现实现过程相当笨拙。另一方面,可以方便地查看Map的某个部分。只需创建一个集合,然后用它表示那一部分即可。这样一来,Map就可以返回自己键的一个Set、一个包含自己值的List或者包含自己“键-值”对的一个List。和数组相似,Map可方便扩充到多个“维”,毋需涉及任何新概念。只需简单地在一个Map里包含其他Map(后者又可以包含更多的Map,以此类推)。Collection接口Collection是个java.util下的接口,它提供了对集合对象进行基本操作的通用接口方法。它有三个基本的方法:booleanadd(Objectobj):用于将一个对象放入到集合中,当原有Collection对象改变后,它返回true;booleanaddAll(Collectioncol):将另一个Collection对象中的所有元素插入该Collection对象中,当目标Collection对象改变后,它将返回true;Iteratoriterator():它将返回一个Iterator(遍历器)接口对象。List接口顺序是List最重要的特性;它可保证元素按照规定的顺序排列。List为Collection添加了大量方法,以便我们在List中部插入和删除元素(只推荐对LinkedList这样做)。List也会生成一个ListIterator(列表反复器),利用它可在一个列表里朝两个方向遍历,同时插入和删除位于列表中部的元素(同样地,只建议对LinkedList这样做)。List的具体实现类常用的有ArrayList和LinkedList。—ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快。—LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。List接口-Vector类Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。List接口-ArrayList类ArrayList是List接口的大小可变数组的实现。允许包括null在内的所有元素。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小,它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。常用方法(详见API)方法方法说明add(Objecto)将指定的元素添加到此列表的尾部add(intindex,Objecto)将指定元素插入到此列表中的指定位置get(intindex)返回此列表中指定位置上的元素remove(intindex)移除此列表中指定位置上的元素size()返回此列表中的元素数set(intindex,Objecto)用指定的元素替代此列表中指定位置上的元素contains(Objecto)如果此列表中包含指定的元素,则返回trueList接口-LinkedList类LinkedList是List接口的链接列表实现。在一般情况下,LinkedList和ArrayList在操作上非常相似,它们仅仅有一点点区别:ArrayList在尾部插入数据的效率比LinkedList高,LinkedList更适用于随机地在任意位置添加删除数据。LinkedList提供了对尾部和头部的添加与删除操作方法。相比较ArrayList而言,多出的方法如下页表所示。常用方法(详见API)方法名方法说明voidaddFirst(Ee)将指定元素插入到此列表的开头voidaddLast(Ee)将指定元素添加到此列表的结尾EgetFirst()返回此列表的第一个元素EgetLast()返回此列表的最后一个元素EremoveFirst()移除并返回此列表的第一个元素EremoveLast()移除并返回此列表的最后一个元素Set接口Set拥有与Collection完全相同的接口,所以和两种不同的List不同,它没有什么额外的功能。相反,Set完全就是一个Collection,只是具有不同的行为(这是多态最理想的应用:用于表达不同的行为)。添加到Set的每个元素都必须是独一无二的;添加到Set里的对象必须定义equals(),从而建立对象的唯一性。Set拥有与Collection完全相同的接口。一个Set不能保证自己可按任何特定的顺序维持自己的元素。HashSet是Set的一种实现,这种实现中一般要求放入的元素覆写hashCode方法。除此之外其使用方式与ArrayList类似,有一些小区别:(1)HashSet不允许放入重复元素(2)HashSet不能借助Collections类进行排序(3)HashSet的方法没有ArrayList丰富Map接口Map是一种把键对象和值对象进行关联的容器。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性。键和值的关联很简单,用put(Objectkey,Objectvalue)方法即可将一个键与一个值对象相关联。用get(Objectkey)可得到与此key对象所对应的值对象。Map比较常用的实现是HashMap,HashTable。Map中常用方法方法名方法说明clear()清空MapcontainsKey(Objectkey)如果此Map的key中包含指定的key,则返回trueget(Objectkey)返回指定键所映射的值,如果此映射不包含该键的映射关系,则返回nullisEmpty()如果此Map内没有任何数据,则返回truekeySet()将此Map中的所有key放置在一个set中返回put(Objectkey,Objectvalue)将键值对放入Map中remove(Objectkey)将指的key及其对应值从Map中除去size()Map中数据的数目HashMap与HashTable区别Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。HashMap继承Map接口,实现一个key-value映射的哈希表。任何对象都可作为key或者value。Iterator(迭代器)Java中的Iterator功能比较简单,并且只能单向移动:(1)使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。(2)使用next()获得序列中的下一个元素。(3)使用hasNext()检查序列中是否还有元素。(4)使用remove()将迭代器新返回的元素删除。Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。总结如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类(ArrayList、HashMap),其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类(Vector、HashTable)。要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。