映射:层次结构:

(1)Map (接口)其子接口和其实现类如下

(一)EnumMap(抽象类)  implements  Map

(二)SortedMap(接口)     exntends  Map

(三)HashMap                     implements  Map

(四)Hashtable                         implements  Map

 

 EnumMap中的key值和EnumSet的元素的原理非常相似

(一.1)EnumMap的元素加入存储的机制是:当创建EnumMap对象 EnumMap  em=new EnumMap(Season.class);时  就把Season类型的枚举值赋给EnumMap的键(key)属性private transient K[] keyUniverse了:并为private transient Object[] vals属性创建空的数组用来保存EnumMap中的value;底层代码如下:

public EnumMap(Class<K> keyType) {
         this.keyType = keyType;
         keyUniverse = getKeyUniverse(keyType);
         vals = new Object[keyUniverse.length];
     }

put操作的代码如下:先进行类型检查,如果加入的元素类型不是Season或者其父类,则抛出异常,

所以EnumMap中只可以存放相同枚举类型的对象,否则会抛出类型转换异常,然后把key对应的值加入到vals中,同时size加一

public V put(K key, V value) {
         typeCheck(key);        int index = key.ordinal();
         Object oldValue = vals[index];
         vals[index] = maskNull(value);
         if (oldValue == null)
             size++;
         return unmaskNull(oldValue);
     }

remove的操作如下:

public V remove(Object key) {
         if (!isValidKey(key))
             return null;
         int index = ((Enum)key).ordinal();
         Object oldValue = vals[index];
         vals[index] = null;
        if (oldValue != null)
             size--;
         return unmaskNull(oldValue);
     }

(二.1)TreeSet                     implements    SortedSet

(三.1)LinkedHashSet       exntends  HashSet 

HashMap类中加入元素(可以加入不同类型的元素)的机制和HashSet中的相同:是根据其(键)key元素的equals(Object o)方法和hashCode()方法来判断是否能够加入新的元素,HashMap中的元素是无序的,删除key值也是要通过equals(Object o)方法和hashCode()方法来判断是否存在该key,如果存在则删除,否则删除不成功,HashMap中判断两个value是否相等,只要通过该对象的equals(Object o)进行判断就可以了.

LinkedHashMap的原理和HashMap的相同,只是LinkedHashMap是有序的,先加入的排在前面,底层通过链表来维护这种顺序。

由于HashMap和LinkedHashMap类加入和删除元素的机制是根据add(Object obj)加入对象obj的hashCode()的hash值和equals(Object o)进行比较是否可加入新元素或者存在该元素,由于所有的类的hash值都是整数,是可比较的,并且所有类默认的equals(Object o)方法都可以与任何类型的对象进行比较,如果是与不同类型的对象进行比较时,返回的值是false,所以HashMap和LinkedHashMap类中可加入不同类型的元素.