Java Collections: Maps
USING THE MAP INTERFACE
Dr. Sarah Holderness
PLURALSIGHT AUTHOR
@dr_holderness
Assumptions
Basic Java knowledge using interfaces and
inheritance.
– The Collection and Map Interfaces
What this course
– Using a Map
will focus on
– Practical example analyzing Tweets
The Java Collections Framework
COLLECTIONS FRAMEWORK
COLLECTION INTERFACE MAP INTERFACE
LIST SET MAP
An ordered group A group of unique values An unordered group key
of values that are without an index value pairs that are
indexed indexed by a key
numerically
The Java Collections Framework
COLLECTIONS FRAMEWORK
COLLECTION INTERFACE MAP INTERFACE
LIST SET MAP
An ordered group A group of unique values An unordered group key
of values that are without an index value pairs that are
indexed indexed by a key
numerically
Comparing a List to a Map
A List
Values
Indices
0 1 2 3 4 5 6 7 8
A Map
Values
Keys must be
Keys Compass Hat Ball Cards Wand Crystal unique, values
can be repeated
Map Methods
MAP
Map methods:
Map has 25 methods in Java 8,
•containsKey(), and we’ll cover these here.
•containsValue()
•entrySet(),
•forEach()
•get()
•keySet()
•put()
•putAll()
•remove()
•replace()
•size()
•values()
...and more!
The Map Interface
A Map is an Interface, like a Blueprint, that says you MUST
implement these methods to be a Map:
MAP •...
COMPASS: CARDS: •get()
•put()
•putAll()
CRYSTAL BALL: •remove()
•replace()
WAND: HAT: •size()
•values()
...and more!
But we can’t initialize an Interface, so let’s get more specific…
Can We Initialize a Map Yet?
Map<String, Integer> languages = new Map<String, Integer>();
Since Map is ALSO an Interface, we need a non-abstract
(non-interface) implementation of a Map to initialize.
•Build our own?
•HashMap
•TreeMap
•LinkedHashMap
Can We Initialize a Map Yet?
Map<String, Integer> languages = new Map<String, Integer>();
Since Map is ALSO an Interface, we need a non-abstract
(non-interface) implementation of a Map to initialize.
•Build our own?
Let’s start with a HashMap -
•HashMap one of the most common Maps used
•TreeMap
•LinkedHashMap
Initializing a Map
Our Map will store the names of some programming languages as
keys and the number of courses in our catalog as values.
Map<String, Integer> coursesByLanguage = new HashMap<>();
Initializing a Map
Our Map will store the names of some programming languages as
keys and the number of courses in our catalog as values.
Map<String,
Map String, Integer>
Integer coursesByLanguage = new HashMap<>();
HashMap<>
General Map What’s in Specific type Leave type out
Interface the Map of Map here, it’s inferred
Initializing a Map
If we declare our variable as a Map instead HashMap, we can easily
change the specific kind of Map as needed.
HashMap<String, Integer> languages = new HashMap<>();
HashMap HashMap
This is not wrong…
...but using a general Map on the left lets us switch out the type
of Map we use on the right without changing any other code!
Using a general Map on
Map<String, Integer> languages = new TreeMap
Map TreeMap<>(); the left is more flexible
Map<String, Integer> languages = new MyMap<>();
Map MyMap
Maps Can Hold any Types of Keys and Values
Map of Integer keys and String values
Map<Integer, String> ssn = new HashMap<>();
Map of String keys and objects of class MyProduct values
Map<String, MyProduct> products = new HashMap<>();
Map of Integer key and List of Strings value
Map<Integer, List<String>> tweets = new HashMap<>();
Adding elements to a Map with put()
Map<String, Integer> languagesCount = new HashMap<>();
languagesCount.put("HTML", 5);
languagesCount.put("CSS", 3);
languagesCount.put("JavaScript", 20);
key value
System.out.println(languagesCount.size());
Console output
> 3
Getting elements from a Map with get()
Map<String, Integer> languagesCount = new HashMap<>();
languagesCount.put("HTML", 5);
languagesCount.put("CSS", 3);
languagesCount.put("JavaScript", 20);
System.out.println("Num of HTML courses: ", languagesCount.get("HTML"));
Console output
> Num of HTML courses: 5
Checking if a Map Contains a Certain Key
Map<String, Integer> languagesCount = new HashMap<>();
languagesCount.put("HTML", 5);
languagesCount.put("CSS", 3);
languagesCount.put("JavaScript", 20);
if (languagesCount.containsKey("HTML"))
System.out.print("Yes! We do teach HTML");
else
System.out.print("We do not teach HTML");
Console output
> Yes! We do teach HTML
Iterating through the Map Entries
key "HTML" "CSS" "JS"
value 5 3 20
A Map.Entry is an entrySet() returns a Set of the
individual key/value pair key/value Entries used for iterating
for(Map.Entry<String, Integer> entry : languagesCount.entrySet()) {
System.out.format("%d %s courses%n", entry.getValue(), entry.getKey());
}
Console output
Prints each entry’s
> 3 CSS courses value and key in this
5 HTML courses format.
20 JS courses
A Map’s Key Set
key "HTML" "CSS" "JS"
value 5 3 20
System.out.println("The languages we teach are: " + languagesCount.keySet());
Note that keySet() returns a
Set and Sets have unique
values. This is possible since
Map keys must also be unique.
Console output
> The languages we teach are: [CSS, JS, HTML]
Summing the Map Values
key "HTML" "CSS" "JS"
value 5 3 20
int sumCourses = 0;
Note that values() returns a
for(Integer value : languagesCount.values()) { List not a Set since the values
sumCourses += value; do not need to be unique.
}
System.out.println("Total courses: " + sumCourses);
Console output
> Total courses: 28
How are the entries
ordered in a Map?
• HashMap - no order is guaranteed
Order Depends on • LinkedHashMap - insertion order
is preserved
the Type of Map
• TreeMap - elements are in sorted
order by key
TreeMap Keys are Sorted
Map<String, Integer> languagesCount = new TreeMap<>();
languagesCount.put("Python", 10);
languagesCount.put("HTML", 5); Notice these are not
languagesCount.put("CSS", 3); added in sorted order
languagesCount.put("JavaScript", 20);
for(Map.Entry<String, Integer> entry : languagesCount.entrySet())
System.out.format("%d %s courses%n", entry.getValue(), entry.getKey());
Console output
Elements are added
> 3 CSS courses in sorted order by
5 HTML courses key to the TreeMap
20 JavaScript courses
10 Python courses
LinkedHashMap Preserves Insertion Order
Map<String, Integer> languagesCount = new LinkedHashMap<>();
languagesCount.put("Python", 10);
languagesCount.put("HTML", 5); Notice these are not
languagesCount.put("CSS", 3); added in sorted order
languagesCount.put("JavaScript", 20);
for(Map.Entry<String, Integer> entry : languagesCount.entrySet())
System.out.format("%d %s courses%n", entry.getValue(), entry.getKey());
Console output
> 10 Python courses Elements are in the
order in which they
5 HTML courses were added
3 CSS courses
20 JavaScript courses