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; }