学习笔记22 map

一、概论

map的每个元素都由两个部分组成:键和值。每个键都与一个特定的值相关联,并且可以用于定位该值。

map和set很像,只不过map存储的是key,由key再映射到value,而set存储的就是value本身。

Map接口是泛型的,由两个类型变量K和V进行参数化。它们分别代表表示键和值对象的类型。

map接口:

学习笔记22 map_第1张图片

学习笔记22 map_第2张图片

如果我们想要得到map的键和值:

 特别的,对于Set< Map.Entry > entrySet()

Map map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);

Set> entrySet = map.entrySet();
for (Map.Entry entry : entrySet) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Key = apple, Value = 1
Key = banana, Value = 2
Key = orange, Value = 3

这个方法返回一个set,set中的元素是map中的每个键值对 。

为什么非要用这个方法才能得到键值对?为什么不能直接对map集合用get方法?因为对map集合直接用get方法是通过键返回值。

二、HashMap Class

1.构造器

学习笔记22 map_第3张图片

学习笔记22 map_第4张图片

 2.几种常用的方法

我们用一个例子来过一遍HashMap常用的方法

import java.util.*;

public class CarHashMap1 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 按VIN搜索Mustang
        System.out.println("\nSearching for the car with VIN " + mustang.getVin());
        Car foundCar = carMap.get(mustang.getVin());

        // 如果找到了车辆,则显示它。
        if (foundCar != null)
            System.out.println(foundCar);
        else
            System.out.println("The Mustang is NOT in the set.");

        // 搜索另一个VIN。这个VIN不在集合中。
        System.out.println("\nSearching for the car with VIN 911C87");
        foundCar = carMap.get("911C87");

        // 如果找到了车辆,则显示它。
        if (foundCar != null)
            System.out.println(foundCar);
        else
            System.out.println("That car is NOT in the set.");
    }
}

Searching for the car with VIN 448A69

VIN: 448A69 Description: 1965 Mustang

Searching for the car with VIN 911C87

That car is NOT in the set.

构造一个hashmap:

Map carMap = new HashMap<>();

Note that the Map interface has been specialized to Map because String is the data type of the keys and Car is the data type of the values  

 向hashmap中添加键值对:

carMap.put(vw.getVin(), vw);

在hashmap中找键对应的值:

Car foundCar = carMap.get(mustang.getVin());

3.遍历hashmap

与Set和List接口不同,Map接口没有扩展Collection接口。而且,与其他集合类型不同,Map并不提供迭代器。如果要遍历Map,我们需要将其映射关系转换为其他collection。

例如,可以使用keySet()方法获取一个包含Map中所有键的Set Collection,也可以使用values()方法获取一个包含Map中所有值的Collection。然后可以对得到的Set或Collection进行迭代。

import java.util.*;

public class CarHashMap2 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 获取一个包含Map中所有键的Set集合。
        Set keys = carMap.keySet();

        // 遍历所有键,打印每个键。
        System.out.println("Here are the keys:");
        for (String k : keys)
            System.out.println(k);

        // 获取一个包含Map中所有值的Collection集合。
        Collection values = carMap.values();

        // 遍历所有值,打印每个值。
        System.out.println("\nHere are the values:");
        for (Car c : values)
            System.out.println(c);
    }
}

Here are the keys:

177R60

227H54

448A69

453B55

Here are the values:

VIN: 177R60 Description: 1980 BMW

VIN: 227H54 Description: 1997 Volkswagen

VIN: 448A69 Description: 1965 Mustang

VIN: 453B55 Description: 2007 Porsche

从keySet()和values()方法返回的Set和Collection都作为对Map的“视图”。集合和集合中的元素仅仅是对Map中实际条目的引用因此在集合或集合中对元素所做的任何更改都会反映使用这种方法得到的Map中,反之亦然。换句话说,如果更改了Map中的条目,那么在Set和Collection中引用该条目的元素也会相应地更改。 

这里我们返回了两个set,反别存储key和value,当然我们也可以用一个set存放整个键值对,这里我们需要用到entrySet method

import java.util.*;

public class CarHashMap3 {
    public static void main(String[] args) {
        // 创建一个HashMap来存储Car对象
        Map carMap = new HashMap<>();

        // 创建一些Car对象
        Car vw = new Car("227H54", "1997 Volkswagen");
        Car mustang = new Car("448A69", "1965 Mustang");
        Car porsche = new Car("453B55", "2007 Porsche");
        Car bmw = new Car("177R60", "1980 BMW");

        // 将一些映射关系添加到HashMap中。在每个映射关系中,车辆的VIN是键,包含该VIN的Car对象是值。
        carMap.put(vw.getVin(), vw);
        carMap.put(mustang.getVin(), mustang);
        carMap.put(porsche.getVin(), porsche);
        carMap.put(bmw.getVin(), bmw);

        // 获取一个包含Map中所有映射关系的Set>。
        Set> cars = carMap.entrySet();

        // 遍历所有映射关系,输出每个映射关系的键和值。
        System.out.println("Here are the mappings:");
        for (Map.Entry entry : cars) {
            System.out.println("Key =" + entry.getKey());
            System.out.println("Value =" + entry.getValue());
            System.out.println();
        }
    }
}
Here are the mappings:
Key = 177R60
Value = VIN: 177R60 Description: 1980 BMW
Key = 227H54
Value = VIN: 227H54 Description: 1997 Volkswagen
Key = 448A69
Value = VIN: 448A69 Description: 1965 Mustang
Key = 453B55
Value = VIN: 453B55 Description: 2007 Porsche

The getKey method returns the key and getValue returns the value.
在java8之后,对于map,我们也有对应的forEach方法:
void forEach(BiConsumer action)

这个操作必须实现BiConsumer接口。这意味着操作函数必须具有与类型 (K, V) → void 相关的类型;它的参数是一个键和一个值,其返回类型为void。

使用这个方法,我们可以对上面的例子做出如下修改:

System.out.println("Here are the mappings:");
carMap.forEach( (key, value) −>
 {
 System.out.println("Key = " + key);
 System.out.println("Value = " + value);
 System.out.println();
 });

三、LinkedHashMap Class

LinkedHashMap类是HashMap的子类,它允许按照以下两种顺序访问其中的映射关系:
- 插入顺序:按照映射关系插入到Map中的顺序进行访问。
- 访问顺序:按照映射关系最近一次被访问的时间进行访问。

LinkedHashMap通过内部的链表引用映射关系。如果在插入顺序模式下使用该Map,则链表按照插入顺序引用映射关系。如果在访问顺序模式下使用该Map,则链表按照使用put或get方法访问映射关系的顺序进行引用。

在访问顺序模式下,最常访问的映射关系位于链表的末尾,最少访问的映射关系位于链表的开头。这种模式在需要知道哪些数据项被最多或最少访问的应用程序中非常有用。

学习笔记22 map_第5张图片

四、TreeMap Class 

我们使用TreeMap类来创建一个按键排序的Map。

SortedMap接口中定义了一些与排序相关的方法,例如:按键排序的方法(keySet()、subMap()、headMap()和tailMap()),以及按照键所在的顺序返回映射关系的方法(firstKey()、lastKey()等)等。TreeMap类可以使用这些方法来按照键排序存储映射关系。当然,为了使TreeMap可以按照键进行排序,TreeMap要求其键必须是可比较的(即,实现了Comparable接口或传入了一个Comparator对象)。

学习笔记22 map_第6张图片

你可能感兴趣的:(学习,笔记)