/** * Returns a shallow copy of this HashMap. The keys and values * themselves are not cloned. */ public synchronized Object clone() { try { expungeStaleEntries(); ConcurrentReferenceHashMap t = (ConcurrentReferenceHashMap) super.clone(); t.table = new Entry[table.length]; for (int i = table.length; i-- > 0;) { Entry e = table[i]; if (e != null) { t.table[i] = (Entry) e.clone(t.queue); e = e.getNext(); for (Entry k = t.table[i]; e != null; e = e.getNext()) { k.setNext((Entry) e.clone(t.queue)); k = k.getNext(); } } } t.keySet = null; t.entrySet = null; t.values = null; return t; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } }
/** * Expunge stale entries from the table. */ private void expungeStaleEntries() { Object r; while ((r = queue.poll()) != null) { Entry entry = (Entry) r; int hash = entry.getHash(); Entry[] tab = table; int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry e = tab[index], prev = null; e != null; prev = e, e = e.getNext()) { if (e == entry) { if (prev != null) prev.setNext(e.getNext()); // otherwise put the bucket after us else tab[index] = e.getNext(); count--; if (keyType == HARD) valueExpired(e.getKey()); else keyExpired(e.getValue()); } } } }
/** * Returns a shallow copy of this HashMap. The keys and values * themselves are not cloned. */ public synchronized Object clone() { try { expungeStaleEntries(); ConcurrentReferenceHashMap t = (ConcurrentReferenceHashMap) super.clone(); t.table = new Entry[table.length]; for (int i = table.length; i-- > 0;) { Entry e = table[i]; if (e != null) { t.table[i] = (Entry) e.clone(t.queue); e = e.getNext(); for (Entry k = t.table[i]; e != null; e = e.getNext()) { k.setNext((Entry) e.clone(t.queue)); k = k.getNext(); } } } t.keySet = null; t.entrySet = null; t.values = null; return t; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } }
if ((keyType != HARD && old.getKey() == null) || valueType != HARD && old.getValue() == null) { Entry e = old; old = old.getNext(); e.setNext(null); count--; } else { Entry e = (Entry) old.clone(queue); old = old.getNext(); int index = (e.getHash() & 0x7FFFFFFF) % newCapacity; e.setNext(newMap[index]); newMap[index] = e;
/** * Returns a shallow copy of this HashMap. The keys and values * themselves are not cloned. */ public synchronized Object clone() { try { expungeStaleEntries(); ConcurrentReferenceHashMap t = (ConcurrentReferenceHashMap) super.clone(); t.table = new Entry[table.length]; for (int i = table.length; i-- > 0;) { Entry e = table[i]; if (e != null) { t.table[i] = (Entry) e.clone(t.queue); e = e.getNext(); for (Entry k = t.table[i]; e != null; e = e.getNext()) { k.setNext((Entry) e.clone(t.queue)); k = k.getNext(); } } } t.keySet = null; t.entrySet = null; t.values = null; return t; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } }
/** * Returns a shallow copy of this HashMap. The keys and values * themselves are not cloned. */ public synchronized Object clone() { try { expungeStaleEntries(); ConcurrentReferenceHashMap t = (ConcurrentReferenceHashMap) super.clone(); t.table = new Entry[table.length]; for (int i = table.length; i-- > 0;) { Entry e = table[i]; if (e != null) { t.table[i] = (Entry) e.clone(t.queue); e = e.getNext(); for (Entry k = t.table[i]; e != null; e = e.getNext()) { k.setNext((Entry) e.clone(t.queue)); k = k.getNext(); } } } t.keySet = null; t.entrySet = null; t.values = null; return t; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } }
if ((keyType != HARD && old.getKey() == null) || valueType != HARD && old.getValue() == null) { Entry e = old; old = old.getNext(); e.setNext(null); count--; } else { Entry e = (Entry) old.clone(queue); old = old.getNext(); int index = (e.getHash() & 0x7FFFFFFF) % newCapacity; e.setNext(newMap[index]); newMap[index] = e;
if ((keyType != HARD && old.getKey() == null) || valueType != HARD && old.getValue() == null) { Entry e = old; old = old.getNext(); e.setNext(null); count--; } else { Entry e = (Entry) old.clone(queue); old = old.getNext(); int index = (e.getHash() & 0x7FFFFFFF) % newCapacity; e.setNext(newMap[index]); newMap[index] = e;
if ((keyType != HARD && old.getKey() == null) || valueType != HARD && old.getValue() == null) { Entry e = old; old = old.getNext(); e.setNext(null); count--; } else { Entry e = (Entry) old.clone(queue); old = old.getNext(); int index = (e.getHash() & 0x7FFFFFFF) % newCapacity; e.setNext(newMap[index]); newMap[index] = e;
/** * Expunge stale entries from the table. */ private void expungeStaleEntries() { Object r; while ((r = queue.poll()) != null) { Entry entry = (Entry) r; int hash = entry.getHash(); Entry[] tab = table; int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry e = tab[index], prev = null; e != null; prev = e, e = e.getNext()) { if (e == entry) { if (prev != null) prev.setNext(e.getNext()); // otherwise put the bucket after us else tab[index] = e.getNext(); count--; if (keyType == HARD) valueExpired(e.getKey()); else keyExpired(e.getValue()); } } } }
/** * Returns true if this HashMap maps one or more keys to the specified * value. * * @param value value whose presence in this Map is to be tested. */ public boolean containsValue(Object value) { Entry[] tab = table; if (value == null) { if (valueType != HARD) return false; for (int i = tab.length; i-- > 0;) for (Entry e = tab[i]; e != null; e = e.getNext()) if (e.getValue() == null) return true; } else { for (int i = tab.length; i-- > 0;) for (Entry e = tab[i]; e != null; e = e.getNext()) if (eq(value, e.getValue())) return true; } return false; }
/** * Expunge stale entries from the table. */ private void expungeStaleEntries() { Object r; while ((r = queue.poll()) != null) { Entry entry = (Entry) r; int hash = entry.getHash(); Entry[] tab = table; int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry e = tab[index], prev = null; e != null; prev = e, e = e.getNext()) { if (e == entry) { if (prev != null) prev.setNext(e.getNext()); // otherwise put the bucket after us else tab[index] = e.getNext(); count--; if (keyType == HARD) valueExpired(e.getKey()); else keyExpired(e.getValue()); } } } }