映射:层次结构:
(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类中可加入不同类型的元素.