分享

Collection List Set Map 区别

 pengx 2008-05-18
Iterator接口
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
Iterator模式总是用同一种逻辑来遍历集合:
  for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
  奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
  客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
  首先看看java.util.Iterator接口的定义:
  public interface Iterator {
  boolean hasNext();
  Object next();
  void remove();
  }
依赖前两个方法就能完成遍历,典型的代码如下:
  for(Iterator it = c.iterator(); it.hasNext(); ) {
  Object o = it.next();
  // 对o的操作...
  }
  在JDK1.5中,还对上面的代码在语法上作了简化:
  // Type是具体的类型,如String。
  for(Type t : c) {
  // 对t的操作...
  }
  每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。
要确保遍历过程顺利完成,必须保证遍历过程中不更改集合的内容(Iterator的remove()方法除外),因此,确保遍历可靠的原则是只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。
  最后给个完整的示例:
  Collection c = new ArrayList();
  c.add("abc");
  c.add("xyz");
  for(Iterator it = c.iterator(); it.hasNext(); ) {
  String s = (String)it.next();
  System.out.println(s);
  }
  如果你把第一行代码的ArrayList换成LinkedList或Vector,剩下的代码不用改动一行就能编译,而且功能不变,这就是针对抽象编程的原则:对具体类的依赖性最小。
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。  它也比 HashMap 慢,因为它是同步的。  
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
   int h = x.hashCode();

   h += ~(h << 9);
   h ^= (h >>> 14);
   h += (h << 4);
   h ^= (h >>> 10);
   return h;
}
static int indexFor(int h, int length) {
   return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。  
private static Map map = new HashMap();
     static {
         map.put("bbb", "XXXX");
         map.put("aaa", "XXXX");
         map.put("cccc", "XXXX");
...................
     }
     /**
      * @param args
      * @throws Exception
      */
     public static void main(String[] args) throws Exception {
         .................
         Set set = map.keySet();
         Iterator it = set.iterator();
         Date date=new Date();
         while (it.hasNext()) {
             Object key =it.next();
             Object value = map.get(key);
//Interface Iterator 中的三个方法
boolean
hasNext()
           Returns true if the iteration has more elements.
next()
           Returns the next element in the iteration.
void
remove()
           Removes from the underlying collection the last element returned by the iterator (optional operation).
//
             }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多