发一个完全体力活的帖子,是对JDK的中Collection接口的总结,说明全部摘自JDK6.0。
Map接口: | + -- WeakHashMap: 以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条 | 目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终 | 止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。此实现 | 不是同步的。 | + -- TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的 | 构造方法。此实现不是同步的。 | + -- HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了 | 非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺 | 序恒久不变。此实现不是同步的。 | +-- SortedMap: 进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有 序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回 )进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映 射)。Collection接口: | + -- Set接口:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并 | | 且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。 | | | + -- HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序; | | 特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,此实现不是同 | | 步的。 | | | + -- LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在 | | 于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set | | 中 的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。此实现不是同步 | | 的。 | | | + -- TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时 | 提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为基本操作(add、remove 和 contains) | 提供受保证的 log(n) 时间开销。此实现不是同步的。 | + -- List接口:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户 | 可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 | + -- ArrayList:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。 | 除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 | Vector 类,除了此类是不同步的。)每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数 | 组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增 | 长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。此实现不是同步的。 | + -- LinkedList:List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实 | 现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方 | 法。这些操作允许将链接列表用作堆栈、队列或双端队列。提供先进先出队列操作(FIFO)。此实现不是同步的。 | + -- Vector:Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是 ,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。此实现是同步的
/* 一些常用的集合类的方法的用法演示。 JAVA容器的两种基本类型: 区别在于每个位置保存的元素个数 Collection:一组独立的元素通常都 要服从某种规则。 List按对象进入的顺序保存对象,不做排序和编辑; 而set则是不能有重复的元素,即每个对象只接受一次,并有自己的内部的排序算法。 Map:一组成对的“键值对”对象,get()时一般返回Entry -->是一种专门针对Hash容器的数据类型,用来保存键值对。 */ import java.util.*; public class JAVAContainer { /*介绍集合之前先看一看迭代器: 简化对集合的操作,主要功能是遍历并选择集合中的对象,其中有三个最要的方法: 1.hasNext() 返回布尔值 看集合中还有没有元素 2.next() 返回下一个元素 返回的是O的所一定要强转一下 3.remove() 元素删除 接口 Iterator: 构建一个Iterator迭代器 -->Iterator iterator=所要进行迭代的集合对象.iterator(); 接口 Enumeration<E>: 注意=====Enumeration已经不是主流,Iterator是它的下一代替代品 构建一个Enumeration迭代器-->Enumeration enumeration=所要进行迭代的集合对象.elements() */ public static void main(String[] args) throws Exception{ //ArrayList: 允许包括 null 在内的所有元素,此类是线程不同步的 { ArrayList arraylist=new ArrayList(); arraylist.add(0,"end"); //指定索引加入值,需注意的是,如果现有2个值,我加入索引为5的那么就会出现异常,即不能越位 for(int i=0;i<2;i++){ arraylist.add(i,String.valueOf(i)); //将指定元素加入指定位置 } System.out.println("ArrayList:"); for(int i=0;i<arraylist.size();i++){ System.out.print(arraylist.get(i)+";"); //get(int i)取出指定位置的元素 } arraylist.add("0");//直接加入值到ArrayList的最后 arraylist.add("0"); // arraylist.lastIndexOf("0") 返回指定的对象在列表中最后一次出现的位置索引 System.out.print("/nArrayList/'s lastIndexOf(/"0/") is "+arraylist.lastIndexOf("0")); } // Collections: 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成 { String []array=new String[]{"a","b","c"}; List list=Arrays.asList(array); // aslist(Object []) 通过一个已有数组,构造一个List对象 Collections.fill(list,"Fill"); //用Fill填充全部元素 使用指定元素替换指定列表中的所有元素。 System.out.println("/nCollections:"); for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+";"); } array=new String[]{"1","2","3"}; List list2=Arrays.asList(array); Collections.copy(list,list2); //拷贝list2的数据进list System.out.println("/n"+list); Collections.swap(list,2,1); //调换索引为1和2的元素的位置 在指定列表的指定位置处交换元素 System.out.println(list); } // HashMap 一个速度最快的容器,此类不保证映射的顺序,特别是它不保证该顺序恒久不变,不是线程同步 { HashMap hashmap=new HashMap(); hashmap.put("0","c"); //存放对象用put方法 记住所存的一定是键值对 hashmap.put("1","a"); hashmap.put("2","b"); hashmap.put("3","a"); System.out.println("HashMap:"); System.out.println(hashmap); //该容器有其内部的排序方式 事实上是依据哈希算法来排的 Set set=hashmap.keySet(); //获取全部键 它的返回类型是set Iterator iterator=set.iterator(); while(iterator.hasNext()){ System.out.print(hashmap.get(iterator.next())+";"); } } // HashSet 不保证集合的迭代顺序 { HashSet hashset=new HashSet(); //一个绝对不能重复的类型 如果有遇到存重复的值不会报异常,只是add()会返一个boolean型的 false,当然肯定是不会把该元素加入集合 中的,它同样有size(),isEmpty(),remove()等方法。 hashset.add("c"); hashset.add("b"); hashset.add("a"); hashset.add("a"); hashset.add("b"); System.out.println("/nHashSet:"); System.out.println(hashset); Iterator iterator=hashset.iterator();//取出元素 while(iterator.hasNext()){ System.out.print(iterator.next()+";"); } } //Hashtable 任何非 null 对象都可以用作键或值,现在用得不多啦,一个完全可以由其他容器替换的老容器类型 { Hashtable hashtable=new Hashtable(); hashtable.put("0","c"); hashtable.put("1","a"); hashtable.put("3","c"); hashtable.put("2","b"); System.out.println("/nHashtable:"); //注意与之对应的迭代器是Enumeration,而不是Iterator Enumeration enumeration=hashtable.elements();//获取元素,Enumeration已经不是主流,Iterator是它的下一代替代品 while(enumeration.hasMoreElements()){ System.out.print(enumeration.nextElement()+";"); } } //TreeMap { TreeMap treemap=new TreeMap(); treemap.put("0","d"); //指定键值,如果映射以前包含一个此键的映射关系,那么将替换原值 treemap.put("2","a"); treemap.put("1","b"); treemap.put("3","c"); System.out.println("/nTreeMap:");//可以对键排序 System.out.println(treemap); System.out.println(treemap.firstKey());//返回第一个键 Set set=treemap.keySet(); Iterator iterator=set.iterator(); while(iterator.hasNext()){ System.out.print(treemap.get(iterator.next())+";"); } } //TreeSet { TreeSet treeset=new TreeSet();//自动排序内容 treeset.add("b"); treeset.add("a"); treeset.add("c"); treeset.add("d"); System.out.println("/nTreeSet:"); System.out.println(treeset); System.out.println(treeset.first());//返回第一个元素 Iterator iterator=treeset.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+";"); } } //Vector 一个最早的容器类,实现方式最老,同是它是线程同步的的,所以效率最慢,先进先出 { Synchronized public Vector getItems(){ //线程同步的方法 return ....; } Vector vector=new Vector(); vector.add(0,"b"); //在指定位置加入指定元素 vector.add("a"); //加到最后 vector.addElement("d"); //加到最后,将其集合的大小加1 vector.add("c"); System.out.println("/nVector:"); System.out.println(vector); vector.set(2,"h");//替换掉指定索引的元素 System.out.println(vector); Object []str=vector.toArray(); //将集合中的元素拷到一个数组中,注间因为集合中存的是对象,所以数组必须是Object类型 for(int i=0;i<str.length;i++){ System.out.print(str[i]+";"); } vector.setSize(2);//重新设置大小为2 System.out.println("/n"+vector); } } }
