Однажды мне понадобилась одна вещь, которая работает как стандартный HashMap, но за небольшим исключением. Как известно HashMap хранит пары вида Ключ-Значение (Key-Value), а значение можно извлечь по ключу. Если в HashMap добавляется значение и ключ уже существующий в HashMap, то старое значение заменяется новым. Но мне нужно было, наоборот, чтобы старое значение не затиралось, а новое значение попросту игнорировалось. Для этого пришлось немного расширить HashMap, переопределив метод
put:
public class FirstInHashMap extends HashMap{
@Override
public V put(K key, V value) {
return super.containsKey(key) ? super.get(key) : super.put(key,value);
}
}
Здесь первым делом идет проверка на присутствие ключа в HashMap. При наличии ключа идет поиск значения. При отсутствии ключа ключ и значение добавляются в HashMap. Заметим, что реализация нашего метода построена на вызовах методом (containsKey, get и put) из базового класса HashMap. Сигнатура метода
put требует возвращения значения, значение берется от методов
get и
put соответственно.
Сравним работу HashMap и нашего FirstInHashMap:
Map map = new HashMap<>();
map.put("word",1);
map.put("word",5);
Map myMap = new FirstInHashMap<>();
myMap.put("word",1);
myMap.put("word",5);
System.out.println("HashMap: " + map.get("word"));//HashMap вернет 5
System.out.println("FirstInHashMap: " + myMap.get("word"));//FirstInHashMap 1
В данном примере мы кладем по порядку значения
1 и
5 с ключом
word в обе Map'ы.
HashMap вернет
5, а FirstInHashMap вернет
1.