1. Набор от двойки ключ-стойност.

В Java друга интересна колекция (най-общо казано) е Map. Понякога тази структура от данни се нарича също речник.
Той е подобен на Setколекцията, но съхранява набор от „двойки“ елементи, а не набор от елементи. Всяка двойка в се състои Mapот два елемента: „ключ“ и „стойност“.
Да приемем, че искате вашата програма да съхранява имената на служителите и техните заплати or имената на вашите колеги и тяхната възраст. Тогава ще ви трябва table като тази:
| Име | Възраст |
|---|---|
| Илон | 21 |
| Джеф | 22 |
| Бил | 48 |
| Уорън | ? |
Всеки ред съдържа няколко стойности. Ще наричаме името ключ на двойката, а възрастта - стойността на двойката .
Целият набор от тези двойки е нашата карта ( Map).
Ключът на двойка може да бъде всичко освен null. Ключовете трябва да са уникални: една карта не може да съдържа два еднакви ключа.
2. HashMapклас
Класът HashMapе най-популярният вид Mapколекция. От една страна, той е много подобен на HashSet и има всички негови методи. От друга страна, той е като списък ( ArrayList), който може да използва думи (or нещо друго) като свои индекси.
Можете да създадете, HashMapкато използвате израз като този:
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
Къде KeyTypeе типът на ключовете в съхранените двойки и ValueTypeе типът на стойностите в двойките, съхранени в HashMapколекцията.
Класът HashMapима методи като този:
| Метод | Описание |
|---|---|
|
Добавя двойката ( key, value) към колекцията |
|
Връща стойността, свързана с ключ. |
|
Проверява дали съществува ключ в колекцията |
|
Проверява за съществуването на стойност в колекцията |
|
Премахва елемент от колекцията |
|
Изчиства колекцията, като премахва всички елементи |
|
Връща броя на двойките ключ-стойност в колекцията |
|
Връща набора от ключове в колекцията |
|
Връща набор, съдържащ елементите на колекцията |
|
Връща набор ( Set) от всички двойки ( Map.Entry) в колекцията. |
Добавяне на елементи към aHashMap
Елементите се добавят към карта като двойки с помощта на put()метода. Ключът се предава като първи аргумент, а стойността се предава като втори.
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Когато добавяте двойка ключ-стойност, ако ключът вече съществува в колекцията, тогава старата стойност се заменя с новата стойност.
Това поведение създава HashMapподобен масив or списък, чиито индекси са думи ( String) instead of числа.
Почти всеки тип може да бъде KeyType or ValueType. Има някои малки допълнителни изисквания за KeyType и ще научите за тях, когато изучавате по-подробно колекциите в мисията за колекции на Java.
3. Подмножества на a HashMap: множеството от ключове
Да кажем, че просто искаме да покажем всички записи в a HashMapна екрана. Как да направим това? За да направим това, трябва да знаем How да преминем през всички записи в HashMap. Това може да стане по няколко начина.
Най-лесният начин е да преминете през ключовете
HashMapзаписите не са номерирани последователно, така че цикъл с брояч няма да работи тук. Но можем да получим набор от ключове с помощта на keySet()метода и вие вече знаете How да обхождате набор:
| Код | Описание |
|---|---|
|
Преминете към ключовете на mapВземете стойността, свързана с ключа |
Методът keySet()връща набор от ключове. Можете да използвате този комплект по два начина:
| Компактна нотация | Дълга нотация |
|---|---|
|
|
4. Обхождане на двойки ключ-стойност
Има и по-сложен начин: можете да трансформирате a Mapв набор от двойки ключ-стойност и след това да преминете през елементите на набора, Howто вече научихме.
Колекцията HashMapима помощен клас, който съхранява двойка ключ-стойност. Изглежда приблизително така:
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
Резултатът от извикването на entrySet()метода на обект ще бъде :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>
Set<Entry<KeyType, ValueType>> name = map.entrySet();
Тук имаме генеричен Setклас с тип параметър, който от своя страна е генеричен тип ( Entry) с два тип параметъра.
Много е лесно за начинаещ да се обърка в това. Но след като го разберете, можете да напишете code като:
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Въпреки това този code може да бъде малко опростен:
Първо, можете да пропуснете създаването на отделна променлива за entriesи instead of това да извикате entrySet()метода директно в forцикъла:
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Второ, можете да използвате наскоро въведения varоператор за автоматично извеждане на типа на двойката ключ-стойност :
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
Не е лошо, а?
5. Сравнение на ArrayListиHashMap
A HashMapсилно прorча на ArrayList, което позволява низове (or други типове) да се използват като индекси (ключовете).
Ако използвате Integerза ключовете в HashMap, то става още по-подобно на ArrayList. Да сравним:
| Код с ArrayList<String> | Код с HashMap<цяло число, низ> |
|---|---|
|
|
GO TO FULL VERSION