public Entry removeRandom() { // this doesn't just use randomEntryIterator() because that iterator // has weaker concurrency guarantees than this method. In particular, // this method will continue to attempt to remove random entries even // as other threads remove the same entries, whereas the random // iterator may return values that have been removed. for (Iterator iter = randomKeys.iterator(); iter.hasNext(); ) { // randomKeys contains null-masked data Object key = iter.next(); if (key != null && randomKeys.remove(key)) { Object val = super.remove(key); if (val != null) return new EntryImpl(unmaskNull(key), unmaskNull(val)); } } // if randomKeys is empty, fall back to non-random behavior. for (Iterator iter = super.keySet().iterator(); iter.hasNext(); ) { Object key = iter.next(); if (key == null) continue; Object val = super.remove(key); if (val != null) return new EntryImpl(unmaskNull(key), unmaskNull(val)); } return null; }
public Entry removeRandom() { // this doesn't just use randomEntryIterator() because that iterator // has weaker concurrency guarantees than this method. In particular, // this method will continue to attempt to remove random entries even // as other threads remove the same entries, whereas the random // iterator may return values that have been removed. for (Iterator iter = randomKeys.iterator(); iter.hasNext(); ) { // randomKeys contains null-masked data Object key = iter.next(); if (key != null && randomKeys.remove(key)) { Object val = super.remove(key); if (val != null) return new EntryImpl(unmaskNull(key), unmaskNull(val)); } } // if randomKeys is empty, fall back to non-random behavior. for (Iterator iter = super.keySet().iterator(); iter.hasNext(); ) { Object key = iter.next(); if (key == null) continue; Object val = super.remove(key); if (val != null) return new EntryImpl(unmaskNull(key), unmaskNull(val)); } return null; }