深入理解java映射map的底层操

映射:层次结构:

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

(一)EnumMap(抽象类)  implements  Map

(二)SortedMap(接口)     exntends  Map           TreeMap extends SortedMap  TreeMap加入如和删除元素是根据key来进行的,其原理和TreeSet完全一样

(三)HashMap                     implements  Map 

(四)Hashtable                         implements  Map             Properties   extends Hashtable         HashMap和Hashtable的关系就像ArrayList和Vector的关系,Hashtable是古老的类,所以尽量少用,原理和Hashtable差不多,Properties   是对属性文件的操作

 

 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是有序的,先加入的排在前面,底层通过链表来维护这种顺序。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值