读IdentityHashMap源码_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 读IdentityHashMap源码

读IdentityHashMap源码

 2017/10/6 12:43:06  红领巾丶  程序员俱乐部  我要评论(0)
  • 摘要://和HashMap的主要区别在于判断key的相等采用的是==//该map计算hash值使用的是System.identityHashCode方法。//并且该Map内部将键存在i位置,值存在i+1位置上。//先看构造函数:publicIdentityHashMap(){init(DEFAULT_CAPACITY);}//初始化2倍initCapacity大小的mapprivatevoidinit(intinitCapacity){threshold=(initCapacity*2)/3
  • 标签:has Map 源码 ide Hash
class="java">
//和HashMap的主要区别在于判断key的相等采用的是==
//该map计算hash值使用的是System.identityHashCode方法。
//并且该Map内部将键存在i位置,值存在i+1位置上。

//先看构造函数:
public IdentityHashMap() {
        init(DEFAULT_CAPACITY);
    }

//初始化2倍initCapacity大小的map
private void init(int initCapacity) {
      
        threshold = (initCapacity * 2)/3;
        table = new Object[2 * initCapacity];
    }
public IdentityHashMap(int expectedMaxSize) {
        if (expectedMaxSize < 0)
            throw new IllegalArgumentException("expectedMaxSize is negative: "
                                               + expectedMaxSize);
					     
        init(capacity(expectedMaxSize));
    }

  public IdentityHashMap(Map<? extends K, ? extends V> m) {
        // Allow for a bit of growth
        this((int) ((1 + m.size()) * 1.1));
        putAll(m);
    }

//添加元素
public V put(K key, V value) {
        //将空的key转化为object
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);

        Object item;
        while ( (item = tab[i]) != null) {
	    //注意这里判断key只用了==比较
            if (item == k) {
                V oldValue = (V) tab[i + 1];
                tab[i + 1] = value;
                return oldValue;
            }
            i = nextKeyIndex(i, len);
        }

        modCount++;
        tab[i] = k;
        tab[i + 1] = value;
	//扩容
        if (++size >= threshold)
            resize(len); // len == 2 * current capacity.
        return null;
    }

//计算hash值
private static int hash(Object x, int length) {
        int h = System.identityHashCode(x);
        // Multiply by -127, and left-shift to use least bit as part of hash
        return ((h << 1) - (h << 8)) & (length - 1);
    }

//i+2
private static int nextKeyIndex(int i, int len) {
        return (i + 2 < len ? i + 2 : 0);
    }

//根据key获取值
   public V get(Object key) {
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);
        while (true) {
            Object item = tab[i];
            if (item == k)
                return (V) tab[i + 1];
            if (item == null)
                return null;
            i = nextKeyIndex(i, len);
        }
    }

//返回元素个数
public int size() {
        return size;
    }

//集合是否为空
public boolean isEmpty() {
        return size == 0;
    }

//是否包含某个key
public boolean containsKey(Object key) {
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);
        while (true) {
            Object item = tab[i];
            if (item == k)
                return true;
            if (item == null)
                return false;
            i = nextKeyIndex(i, len);
        }
    }

//是否包含某个值
 public boolean containsValue(Object value) {
        Object[] tab = table;
        for (int i = 1; i < tab.length; i += 2)
            if (tab[i] == value && tab[i - 1] != null)
                return true;

        return false;
    }

//是否包含某个映射
 private boolean containsMapping(Object key, Object value) {
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);
        while (true) {
            Object item = tab[i];
            if (item == k)
                return tab[i + 1] == value;
            if (item == null)
                return false;
            i = nextKeyIndex(i, len);
        }
    }

//根据key删除映射
public V remove(Object key) {
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);

        while (true) {
            Object item = tab[i];
            if (item == k) {
                modCount++;
                size--;
                V oldValue = (V) tab[i + 1];
                tab[i + 1] = null;
                tab[i] = null;
		//重新调整元素位置
                closeDeletion(i);
                return oldValue;
            }
            if (item == null)
                return null;
            i = nextKeyIndex(i, len);
        }

    }

 private void closeDeletion(int d) {
        
        Object[] tab = table;
        int len = tab.length;

        Object item;
        for (int i = nextKeyIndex(d, len); (item = tab[i]) != null;
             i = nextKeyIndex(i, len) ) {
            int r = hash(item, len);
            if ((i < r && (r <= d || d <= i)) || (r <= d && d <= i)) {
                tab[d] = item;
                tab[d + 1] = tab[i + 1];
                tab[i] = null;
                tab[i + 1] = null;
                d = i;
            }
        }
    }

//清除数组
public void clear() {
        modCount++;
        Object[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }

发表评论
用户名: 匿名