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