public Map<CharSequence, V> getAll() { LinkedList<MapSnapshot> stack = new LinkedList<MapSnapshot>(); MapSnapshot<V> snap = this; int i = 0; while (snap != null) { i += snap.size(); stack.add(snap); snap = snap.parent; } Map<CharSequence, V> out = new HashMap<CharSequence, V>(i); while(!stack.isEmpty()) { snap = stack.removeLast(); for (Object object : snap) { Entry<CharSequence, V> entry = (Entry<CharSequence, V>) object; if (isRemoved(entry.getValue())) { out.remove(entry.getKey()); } else { out.put(entry.getKey(), entry.getValue()); } } } return out; }