Top.Mail.Ru

Перечень уроков по Java

33. Интерфейс Map, Класс HashMap

В Map (отображение) добавляются не отдельные объекты, а пары объектов (ключ, значение). Доступ к значению в коллекции получают по ключу.

Основные методы:

  • void clear(): очищает коллекцию
  • boolean containsKey(Object k): возвращает true, если коллекция содержит ключ k
  • boolean containsValue(Object v): возвращает true, если коллекция содержит значение v
  • Set<map.entry<k, v="">> entrySet()</map.entry<k,>: возвращает набор элементов коллекции. Все элементы представляют объект Map.Entry
  • boolean equals(Object obj): возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj
  • boolean isEmpty: возвращает true, если коллекция пуста
  • V get(Object k): возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значениеnull
  • V put(K k, V v): помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом, то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции, то возвращается значениеnull
  • Set keySet(): возвращает набор всех ключей отображения
  • Collection values(): возвращает набор всех значений отображения
  • void putAll(Map map): добавляет в коллекцию все объекты из отображения map
  • V remove(Object k): удаляет объект с ключом k
  • int size(): возвращает количество элементов коллекции

Класс HashMap

Коллекция HashMap не является упорядоченной: порядок хранения элементов зависит от хэш-функции. Для прохода по всем HashMap объектам с помощью метода values() получаем список объектов и далее, проходим по списку используя итератор. Последовательность объектов при таком проходе произвольная.

 

Класс HashMap имеет несколько конструкторов:

  • HashMap(): конструктор с используемыми по умолчанию значениями начальной емкости (16) и коэффициентом загрузки (0.75)
  • HashMap(int initialCapacity): конструктор с используемым по умолчанию значением коэффициентом загрузки (0.75) и начальной емкостью initialCapacity
  • HashMap(int initialCapacity, float loadFactor): конструктор с используемыми значениями начальной емкости initialCapacity и коэффициентом загрузки loadFactor
  • HashMap(Map m): конструктор с определением структуры согласно указанному параметру.

 

Пример использования методов HashMap.

 

public static void main(String[] args) {
// Создание объекта HashMap
// параметр size() и коэффициент загрузки: по умолчанию
HashMap<string, integer=""> map = new HashMap<string, integer="">();
// Добавление пары ключ-значение
map.put("январь", new Integer(1));
map.put("февраль",new Integer(2));
map.put("март", new Integer(3));
map.put("апрель", new Integer(4));
map.put("май", new Integer(5));</string,></string,>

// Вывод содержимого коллекции map
System.out.println(map);

// Создание второго объекта HashMap
HashMap<string, integer=""> map2 = new HashMap<string, integer="">();</string,></string,>

// Добавление пары ключ-значение
map2.put("июнь", new Integer(6) );
map2.put("июль",new Integer(7));
map2.put("август", new Integer(8));

// Добавление набора элементов объекта map2 к map1
map.putAll(map2);

// Вывод содержимого коллекции map
System.out.println(map);

// Количество элементов коллекции map
System.out.println("map содержит: " + map.size() + " элементов");

// Удаление объекта по ключу "май"
map.remove("май");

// Количество элементов коллекции map
System.out.println("map содержит: " + map.size() + " элементов");

// Поиск по ключу
String exists = (map.containsKey("апрель")) ? "найден" : "не найден";
System.out.println("Объект с ключом 'апрель' " + exists);

// Поиск по значению
exists = (map.containsValue(4)) ? "найден" : "не найден";
System.out.println("Объект со значением 4 " + exists);

// Перебор элементов
Set<map.entry<string, integer="">> set = map.entrySet();
for (Map.Entry<string, integer=""> me : set) {
System.out.println("ключ : " + me.getKey() + ", значение = " + me.getValue());
}</string,></map.entry<string,>

// Вывод всего набора ключей
Set keys = map.keySet();
System.out.println(keys);

// Вывод всего набора значений
Collection values = map.values();
System.out.println(values);

// Замена значения
map.replace("январь",12);
System.out.println(map);

// Очистка объекта map
map.clear();
System.out.println("Размер набора данных: " + map.size());


// hashMap с несколькими значения для одного ключа
//и параметрами size() коэффициентом загрузки по умолчанию
HashMap<string, arraylist<string="">> multiMap = new HashMap<string, arraylist<string="">>();</string,></string,>

// Создаем arrayList и записываем значения для первого ключа
ArrayList listName = new ArrayList();
listName.add("name1");
listName.add("name2");
listName.add("name3");

// Создаем arrayList и записываем значения для второго ключа
ArrayList listPhoto = new ArrayList();

listPhoto.add("photo1");
listPhoto.add("photo2");
listPhoto.add("photo3");
listPhoto.add("photo4");

// помещаем значения для каждого ключа в коллекцию multiMap
multiMap.put("name", listName);
multiMap.put("photo",listPhoto);

// получим весь набор ключей
Set mkeys = multiMap.keySet();
System.out.println("набор ключей: " + mkeys);

// Получаем набор записей
Set<entry<string, arraylist<string="">>> setMap = multiMap.entrySet();</entry<string,>

// Создаем итератор
Iterator<entry<string, arraylist<string="">>> iteratorMap = setMap.iterator();</entry<string,>

System.out.println();
System.out.println("hashMap с несколькими значения для одного ключа");

// Выводим все элементы
while(iteratorMap.hasNext()) {
Map.Entry<string, arraylist<string="">> entry =
(Map.Entry<string, arraylist<string="">>) iteratorMap.next();
String key = entry.getKey();
List mValues = entry.getValue();
System.out.println("Ключ = '" + key + "' его значения: " + mValues);
}
}</string,></string,>

 

Будет выведено:

{май=5, февраль=2, апрель=4, январь=1, март=3}
{август=8, май=5, февраль=2, апрель=4, январь=1, март=3, июль=7, июнь=6}
map содержит: 8 элементов
map содержит: 7 элементов
Объект с ключом 'апрель' найден
Объект со значением 4 найден
ключ : август, значение = 8
ключ : февраль, значение = 2
ключ : апрель, значение = 4
ключ : январь, значение = 1
ключ : март, значение = 3
ключ : июль, значение = 7
ключ : июнь, значение = 6
[август, февраль, апрель, январь, март, июль, июнь]
[8, 2, 4, 1, 3, 7, 6]
{август=8, февраль=2, апрель=4, январь=12, март=3, июль=7, июнь=6}
Размер набора данных: 0
набор ключей: [name, photo]

hashMap с несколькими значения для одного ключа
Ключ = 'name' его значения: [name1, name2, name3]
Ключ = 'photo' его значения: [photo1, photo2, photo3, photo4]