Java集合类和HashMap遍历

JAVA 集合类介绍和使用

类关系示意图
Iterable(接口)
    │
    └
--Collection (接口)
        ├
-List(接口)
        │ ├
-LinkedList  不同步  (构造同步:List list = Collections.synchronizedList(new LinkedList(...));)
        │ ├
-ArrayList   不同步 
        │ └
-Vector      同步
        │ └
--Stack     同步
        └
-Set
            ├
--EnumSet
            ├
--HashSet --LinkedHashSet
            └
--TreeSet

Map
--Hashtable
--HashMap --LinkedHashMap
--WeakHashMap

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 后进行添加或移除项的操作。此实现是同步的.


Collection接口
  Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
  所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
    Iterator it 
= collection.iterator(); // 获得一个迭代子
    while(it.hasNext()) {
      Object obj 
= it.next(); // 得到下一个元素
    }
  由Collection接口派生的两个接口是List和Set。
List接口
  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

LinkedList类
  LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
  注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
    List list 
= Collections.synchronizedList(new LinkedList(...));

ArrayList类
  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

Vector类
  Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

Stack 类
  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

 
*/

package myapp.data;
import myapp.model.Article;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.*;
import java.util.Map.Entry;

public class CollectionMethodTest {
    
    
private static List<Article> list=new ArrayList<Article>(6);
    
    
public static void initialize() throws ParseException{
         
         DateFormat df 
= DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
         list.add(
new Article(1,"NBA1","Carl1","NBA Start1",df.parse("2010-01-1"),1));
         list.add(
new Article(2,"NBA2","Carl2","NBA Start2",df.parse("2010-01-2"),2));
         list.add(
new Article(3,"NBA3","Carl3","NBA Start3",df.parse("2010-01-3"),3));
         list.add(
new Article(4,"NBA4","Carl4","NBA Start4",df.parse("2010-01-4"),4));
         list.add(
new Article(5,"NBA5","Carl5","NBA Start5",df.parse("2010-01-5"),5));
         list.add(
new Article(6,"NBA6","Carl6","NBA Start6",df.parse("2010-01-6"),6));
     }
    
    
     
//列表通常允许重复的元素 ,允许NULL元素,有序
     
//原型:public interface List<E> extends Collection<E>
     
//常用实现类:    AbstractList, ArrayList, LinkedList, Stack, Vector
     public void listTest(){
         
     }
     
    
//HashMap:允许使用 null 值和 null 键,不同步,实现了Map接口和AbstractMap抽象类
    
//原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
     public void hashMapTest(){
         System.out.println(
"--------HashMap遍历------");
         
         Map
<Integer, String> map=new HashMap<Integer,String>();
         
for(Article a : list){
             map.put(a.getId(), a.getTitle()
+a.getContent());
         }
        
//得到map的所有的键
         Set<Integer> keys=map.keySet();
        
//得到map的所有的值
         Collection<String> values=map.values();
        
//返回包含在此映射中的映射关系的 Set 视图。
        Set<Map.Entry<Integer, String>> setEntry=map.entrySet();
        
//使用Iterator遍历器遍历
        System.out.println("--------使用Iterator遍历器遍历------");
        Iterator
<Entry<Integer,String>> it = setEntry.iterator();
        
while(it.hasNext()){
            Entry
<Integer,String> e = it.next();
            System.out.println(
"Id:"+e.getKey()+" Description:"+e.getValue());
        }
        
//使用for遍历
        System.out.println("--------使用for遍历------");
        
for(Entry<Integer,String> e:setEntry){
            System.out.println(
"Id:"+e.getKey()+" Description:"+e.getValue());
        }
     }
     
     
//Set:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素
     
//原型:public interface Set<E> extends Collection<E>
     
//实现类:    AbstractSet, EnumSet, HashSet, LinkedHashSet, TreeSet、 JobStateReasons,CopyOnWriteArraySet
     public void setTest(){
         Set
<String> set=new HashSet<String>();
         set.add(
"No1");
         set.add(
"No2");
         set.add(
"No3");
     }
}
原文地址:https://www.cnblogs.com/hubcarl/p/2007815.html