java_集合体系之Map框架相关抽象类接口详解、源码――08(一)

2014-11-24 07:32:21 · 作者: · 浏览: 0

java_集合体系之Map框架相关抽象类接口详解、源码――08


摘要:Set的实现是基于Map的、所以先搞懂Map、才能去理解Set、否则的话、直接去弄Set会觉得云里雾里、最后发现是浪费时间。这一节介绍关于Map的相关接口、抽象类的功能。


一:Map总体框架图

\

简单说明:

1、上图中虚线且无依赖字样、说明是直接实现的接口

2、虚线但是有依赖字样、说明此类依赖与接口、但不是直接实现接口

3、实线是继承关系、类继承类、接口继承接口

下面的介绍虽然这些都是关于抽象类、接口的定义、但是还是觉得从源码的方向介绍更能直观的说明问题、也更能加深对体系的理解、当然API同样不再给出、会在介绍其具体子类的时候将接口中的API和子类自己新增的API分离开来罗列。


二:Map


1、接口简介:

a)以键值对的形式存储数据、每个键唯一对应一个值、键不允许重复、至于键是否允许为null、视子类而定。

b)其中存放元素是否有序、视子类而定、如HashMap无序、Hashtable有序、排序规则可选按自然排序或者指定排序方式。

c)允许以三种形式获取、迭代Map中的元素、获取键集、获取值集、获取键值实体。

d)子类必须提供两个构造方法、一个是空构造方法、一个是含有指定传入的Map结构中的所有键值对的构造方法(此构造方法是将指定传入的Map智中的键值对全部复制为自己的键值对)。


2、源码分析:


package com.chy.collection.core;

public interface Map
  
    {
    // Query Operations

    /** 返回所有的映射的个数*/
    int size();

    /** 是否含有映射*/
    boolean isEmpty();

    /** 是否包含值为key的key*/
    boolean containsKey(Object key);

    /** 是否包含值为value的value*/
    boolean containsValue(Object value);

    /** 根据指定的key获取value*/
    V get(Object key);

    // Modification Operations

    /** 将一个键值对放入到Map中、返回以前与key关联的值*/
    V put(K key, V value);

    /** 根据传入的key删除一个键值对、返回被删除的key映射的value*/
    V remove(Object key);


    // Bulk Operations

    /** 将指定的Map中的所有的映射放入到当前Map中*/
    void putAll(Map
    m);

    /** 删除当前Map中所有映射*/
    void clear();


    // Views

    /** 获取由Map中所有key组成的Set*/
    Set
   
     keySet(); /** 获取由Map中所有value组曾的Collection*/ Collection
    
      values(); /** 获取由Map中所有映射组成的实体类Map.Entry
     
      组成的Set*/ Set
      
       > entrySet(); /** 组成Map的键值对、仅在Iterator时使用*/ interface Entry
       
         { /** 获取当前映射的key*/ K getKey(); /** 获取当前映射的value*/ V getValue(); /** 设置当前映射的value*/ V setValue(V value); /** 判断当前Entry是否与传入的Object相等*/ boolean equals(Object o); /**获取当前Entry的哈希值*/ int hashCode(); } // Comparison and hashing /** 如果 m1.entrySet().equals(m2.entrySet()),则两个映射 m1 和 m2 表示相同的映射关系。*/ boolean equals(Object o); /** 返回此映射的哈希值*/ int hashCode(); }
       
      
     
    
   
  


简单说明:Map的源码中的方法可以分成:查询、修改(包括添加、删除Map中的映射)、获取视图和一个仅在Iterator的时候使用的内部接口、接口中定义了操作迭代出的每个映射的方法――获取key、获取value、修改映射的value。源码==================

三:AbstractMap


1、抽象类简介:

a)AbstractMap实现了Map接口、提供一些方法的实现、要求所有需要实现Map接口的实现类应该从AbstractMap中继承、可以大大简化编程的代码量。

b)AbstractMap中的方法的简单实现都是围绕第一个获取视图的方法Set > entrySet();得到entrySet、进而获取entrySet的Iterator来操作的、

c)获取视图的剩下两个方法方法是通过两个匿名类new AbstractSet ()、newAbstractCollection 来实现的。

d)还有两个内部类是维护键值对的。

2、源码分析:


package com.chy.collection.core;
import java.util.Iterator;
import java.util.Map.Entry;

public abstract class AbstractMap
  
    implements Map
   
     { /** 默认的构造方法、供子类调用*/ protected AbstractMap() {} // Query Operations /** 返回当前Map映射个数*/ public int size() { return entrySet().size(); } /** 当前映射是否为空*/ public boolean isEmpty() { return size() == 0; } /** 判断当前Map中是否有值为value的映射*/ public boolean containsValue(Object value) { Iterator
    
     > i = entrySet().iterator(); if (value==null) { while (i.hasNext()) { Entry
     
       e = i.next(); if (e.getValue()==null) return true; } } else { while (i.hasNext()) { Entry
      
        e = i.next(); if (value.equals(e.getValue())) return true; } } return false; } /** 判断当前Map中是否有键为key的映射*/ public boolean containsKey(Object key) { Iterator
       
        > i = entrySet().iterator(); if (key==null) { while (i.hasNext()) { Entry
        
          e = i.next(); if (e.getKey()==null) return true; } } else { while (i.hasNext()) { Entry
         
           e = i.next(); if (key.equals(e.getKey())) return true; } } return false; } /** 获取键为key的值*/ public V get(Object key) { Iterator
          
           > i = entrySet().