You can get a LIFO Queue view of a Deque using the asLifoQueue() static method of the Collections class:
<T> Queue<T> asLifoQueue(Deque<T> deque)
To use a Map's implementation as a Set implementation, use the newSetFromMap() static method of the Collections class:
<E> Set<E> newSetFromMap(Map<E, Boolean> map)
To get a weak hash set implementation:
Map map = new WeakHashMap(); // Do not populate and use the map Set wSet = Collections.newSetFromMap(map); // You can use wSet
To create the set using the WeakHashMap implementation class:
// Do not keep the reference of the Map Set wSet = Collections.newSetFromMap(new WeakHashMap());
The Collections class offers the following methods to get read-only views of different types of collections:
<K,V> NavigableMap<K,V> unmodifiableNavigableMap(NavigableMap<K,? extends V> m) <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) <T> List<T> unmodifiableList(List<? extends T> list) <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) <T> Set<T> unmodifiableSet(Set<? extends T> s) <T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s) static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m)
You have one method for each collection type to return the same type of synchronized version of the collection.
<K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m) <T> Collection<T> synchronizedCollection(Collection<T> c) <T> List<T> synchronizedList(List<T> list) <K,V> Map<K,V> synchronizedMap(Map<K,V> m) <T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s) <T> Set<T> synchronizedSet(Set<T> s) <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) <K,V> SortedMap<K,V> synchronizedSortedMap (SortedMap<K,V> m)