在Java 开发中,JDK为我们提供了一些工具类来完成线性表、链表、哈希表等基本的数据结构操作。 这些类和接口在java.util包中可以找到。下面通过一个程序实例来演示说明。 public class TestCollection { public TestCollection() { } List类 //ArrayList实现了List接口,允许空元素,支持增加、删除、替换元素等操作。是一种非同步线程不安全的list 。 public static void testArrayList(){ System.out.println("/*************************ArrayList*********************/"); List<Integer> mArrayList=new ArrayList<Integer>(); mArrayList.add(1); mArrayList.add(3); mArrayList.add(5); System.out.println("ArrayList "+mArrayList); System.out.println("ArrayList index为2的元素 "+mArrayList.get(2));//得到index为2的元素 //用迭代器将其迭代化,将其系列化为一个系列,这样就可以遍历整个序列而不用关心底层结构 Iterator<Integer> mIterator=mArrayList.iterator() ; System.out.println("查看Iterator "+mIterator); System.out.print("依此输出ArrayList的每个元素 "); while(mIterator.hasNext()){ System.out.print(" "+mIterator.next()+" "); } System.out.println(); } /*LinkedList实现了List接口,允许空元素,除支持增加、删除、替换,还提供了pop,push,get等操作 可在LinkedList首部或尾部添加元素,这些操作使LinkedList可被用在堆栈(stack),队列(queue)或双向队列(deque) LinkedList随机选取元素需要在列表中移动,访问越靠近表尾的元素,花费的时间越长。 如果往列表中插入一个元素,LinkedList开销则比ArrayList小的多*/ public static void testLinkedList(){ System.out.println("/*************************LinkedList***********************/"); List<String> mLinkedList=new LinkedList<String>(); List<String> mArrayList=new ArrayList<String>(); mArrayList.add("11"); mArrayList.add("22"); mLinkedList.add("str1"); mLinkedList.add("str2"); mLinkedList.add(null);//最好不要添加空元素。当poll的时候判断为null指示后面的没有元素 mLinkedList.addAll(mArrayList); ((LinkedList<String>) mLinkedList).offer("queue"); ((LinkedList<String>) mLinkedList).addFirst("addFirst");//此处为何要强制转型? ((LinkedList<String>) mLinkedList).pop(); ((LinkedList<String>) mLinkedList).push("push");//等同于addFirst System.out.println("LinkedList "+mLinkedList); System.out.println("顶元素为:"+((LinkedList<String>) mLinkedList).peek()); Iterator<String> mIterator=mLinkedList.iterator(); System.out.println("依此输出LinkedList的每个元素"); while(mIterator.hasNext()){ System.out.print(mIterator.next()+" "); } System.out.println(); } //Vector实现了List接口,是同步、线程安全的。在不是多线程环境中使用,最好选ArrayList public static void testVector(){ System.out.println("/*************************Vector***********************/"); List<Number> mVector=new Vector<Number>(); mVector.add(12.2d); mVector.add(23); mVector.add(1, 3.4f);//在index为1的位置增加元素3.4f System.out.println("Vector "+mVector); Iterator<Number> mIterator=mVector.iterator(); System.out.println("依此输出Vector的每个元素"); while(mIterator.hasNext()){ System.out.print(mIterator.next()+" "); } System.out.println(); } //List/// //Map/// //HashMap实现了Map接口。和HashTable一样是散列表,不可排序,可以添加空值 public static void testHashMap(){ System.out.println("/*************************HashMap***********************/"); Map<String, Object> mHashMap=new HashMap<String, Object>(); mHashMap.put("name", "roger"); mHashMap.put("age", 24); mHashMap.put("sex", "male"); mHashMap.put("salary", null); mHashMap.put(null, null); //Map类都要先转换为最老的迭代Collection后,才能够转换为新的迭代Iterator //也可以将Map类调用entrySet转换为Set<entry<K,V>>,或调用keySet转化为Set<K>再进行操作 Collection<Object> mCollection=mHashMap.values(); System.out.println("HashMap "+mHashMap); System.out.println("由Map转换后的Collection(V) "+mCollection); Iterator<Object> mIterator=mCollection.iterator(); System.out.println("依此输出Collection中的值(V)"); while(mIterator.hasNext()){ System.out.print(mIterator.next()+" "); } System.out.println(); } //HashTable实现了Map接口。不可添加空值,并且HashTable是同步的 public static void testHashtable(){ System.out.println("/*************************Hashtable***********************/"); Map<Integer, String> mHashtable=new Hashtable<Integer,String>(); mHashtable.put(1, "one"); mHashtable.put(2, "two"); mHashtable.put(3, "three"); System.out.println("Hashtable "+mHashtable); //Map类可以先转换为Set集合再进行操作 Set<Integer> mSet=mHashtable.keySet(); System.out.println("由Map转换后的Set(K) "+mSet); System.out.println("依此输出Hashtable中的键和值"); for(Integer i:mSet){ System.out.print(i+","+mHashtable.get(i)+"| "); } System.out.println(); } //TreeMap实现了Map接口。 不可添加空值,并且TreeMap是自动排序的 public static void testTreeMap(){ System.out.println("/*************************TreeMap***********************/"); Map<String, Object> mTreeMap=new TreeMap<String, Object>(); mTreeMap.put("Integer", 2011); mTreeMap.put("Double", 2011.12d); mTreeMap.put("Character", "M"); System.out.println("TreeMap "+mTreeMap); Collection<Object> mCollection=mTreeMap.values(); System.out.println("由Map转换后的Collection(V) "+mCollection); Iterator<Object> mIterator=mCollection.iterator(); System.out.println("依此输出TreeMap中的值(V)"); while(mIterator.hasNext()){ System.out.print(mIterator.next()+" "); } System.out.println(); } public static void testStack(){ System.out.println("/*************************Stack***********************/"); Stack<Integer> mStack=new Stack<Integer>(); mStack.add(10); mStack.add(20); mStack.add(30); System.out.println("Stack "+mStack); Object[] object1=mStack.toArray(); System.out.println("由Stack转换为Object array后取出元素 "); for(int i=0;i<object1.length;i++){ System.out.print(object1[i]+" "); } System.out.println(); System.out.println("使用pop,peek取出元素 "); while(!mStack.empty()){ System.out.print(mStack.peek()+" "); mStack.pop(); } Stack<Map<String, Integer>> mStack2=new Stack<Map<String, Integer>>(); Map<String, Integer> mMap=new HashMap<String,Integer>(); mMap.put("mp1", 1); Map<String, Integer> mMap2=new HashMap<String,Integer>(); mMap2.put("mp1", 2); mStack2.add(mMap); mStack2.add(mMap2); Object[] objects=mStack2.toArray(); System.out.println(); System.out.println("将Stack转换为Object array和使用Iterator将其序列化取出HashMap元素"); for(int i=0;i<objects.length;i++){ System.out.print(objects[i]); } System.out.print(" | "); Iterator<Map<String, Integer>> mIterator=mStack2.iterator(); while(mIterator.hasNext()){ System.out.print(mIterator.next()); }//这种方式取不出Map,是由于Stack LIFO方式决定的 System.out.println(); System.out.println("使用pop,peek取出HashMap元素"); while(!mStack2.empty()){ System.out.print(mStack2.peek()); mStack2.pop(); } } public static void main(String args[]){ testArrayList(); testLinkedList(); testVector(); testHashMap(); testHashtable(); testTreeMap(); testStack(); } }