一、概论
map的每个元素都由两个部分组成:键和值。每个键都与一个特定的值相关联,并且可以用于定位该值。
map和set很像,只不过map存储的是key,由key再映射到value,而set存储的就是value本身。
Map接口是泛型的,由两个类型变量K和V进行参数化。它们分别代表表示键和值对象的类型。
map接口:
如果我们想要得到map的键和值:
特别的,对于Set< Map.Entry<K,V> > entrySet()
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> 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.构造器
2.几种常用的方法
我们用一个例子来过一遍HashMap常用的方法
import java.util.*;
public class CarHashMap1 {
public static void main(String[] args) {
// 创建一个HashMap来存储Car对象
Map<String, Car> 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<String, Car> 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<E>和List<E>接口不同,Map<K, V>接口没有扩展Collection<E>接口。而且,与其他集合类型不同,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<String, Car> 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<String> keys = carMap.keySet();
// 遍历所有键,打印每个键。
System.out.println("Here are the keys:");
for (String k : keys)
System.out.println(k);
// 获取一个包含Map中所有值的Collection集合。
Collection<Car> 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<String, Car> 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<Map.Entry<String, Car>>。
Set<Map.Entry<String, Car>> cars = carMap.entrySet();
// 遍历所有映射关系,输出每个映射关系的键和值。
System.out.println("Here are the mappings:");
for (Map.Entry<String, Car> entry : cars) {
System.out.println("Key =" + entry.getKey());
System.out.println("Value =" + entry.getValue());
System.out.println();
}
}
}
Here are the mappings:Key = 177R60Value = VIN: 177R60 Description: 1980 BMWKey = 227H54Value = VIN: 227H54 Description: 1997 VolkswagenKey = 448A69Value = VIN: 448A69 Description: 1965 MustangKey = 453B55Value = VIN: 453B55 Description: 2007 Porsche
void forEach(BiConsumer<? super K,? super V> action)
这个操作必须实现BiConsumer<? super K,? super V>接口。这意味着操作函数必须具有与类型 (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方法访问映射关系的顺序进行引用。
在访问顺序模式下,最常访问的映射关系位于链表的末尾,最少访问的映射关系位于链表的开头。这种模式在需要知道哪些数据项被最多或最少访问的应用程序中非常有用。
四、TreeMap Class
我们使用TreeMap类来创建一个按键排序的Map。
SortedMap接口中定义了一些与排序相关的方法,例如:按键排序的方法(keySet()、subMap()、headMap()和tailMap()),以及按照键所在的顺序返回映射关系的方法(firstKey()、lastKey()等)等。TreeMap类可以使用这些方法来按照键排序存储映射关系。当然,为了使TreeMap可以按照键进行排序,TreeMap要求其键必须是可比较的(即,实现了Comparable接口或传入了一个Comparator对象)。文章来源:https://www.toymoban.com/news/detail-612531.html
文章来源地址https://www.toymoban.com/news/detail-612531.html
到了这里,关于学习笔记22 map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!