map 接口 位于 java.utils 包下, 表示键和值之间的映射。map以键为基础包含值,即键和值对。每个键和值对都称为一个条目。Map包含唯一的键。
如果您必须基于一个键来搜索、更新或删除元素,那么Map非常有用。
Map 接口 层次结构:
在java中有两个实现Map的接口:Map和SortedMap
,以及三个类:HashMap、LinkedHashMap和TreeMap
。
Java Map的层次结构如下:
Map不允许重复的键,但是可以有重复的值。HashMap和LinkedHashMap允许空键和值,但TreeMap不允许任何空键或值。
Map 非常适合用于键-值关联映射,比如字典。这些Map用于按键执行查找,或者当有人想按键检索和更新元素时使用。
常见场景如下:
Map 接口 创建对象:
因为Map是一个接口,所以不能使用类型映射创建对象。为了创建对象,我们总是需要一个扩展这个映射的类。而且,在Java 1.5中引入泛型之后,可以限制可以存储在Map中的对象的类型。
Map hm = new HashMap();
Map接口的特性:
不能包含重复的键
,每个键最多只能映射到一个值。有些实现允许空键和空值
,比如HashMap和LinkedHashMap,但有些不喜欢TreeMap。因为Map是一个接口,所以它只能与实现该接口的类一起使用。现在,让我们看看如何使用广泛使用的HashMap类在Map上执行一些经常使用的操作。而且,在Java 1.5中引入泛型之后,可以限制可以存储在映射中的对象的类型。
使用Map接口和HashMap类执行各种操作
为了向映射添加元素,可以使用put()方法。但是,hashmap中不保留插入顺序。在内部,为每个元素生成一个单独的散列,并基于这个散列对元素进行索引,以提高效率。
实例:
public static void main(String[] args) {
Map<Integer, String> hm1 = new HashMap<>();
// 使用泛型初始化Map
Map<Integer, String> hm2 = new HashMap<Integer, String>();
// 插入元素
hm1.put(1, "深圳");
hm1.put(2, "广州");
hm1.put(3, "惠州");
hm1.put(3, "惠州2"); // 键不能重复,值会覆盖
hm2.put(new Integer(1), "江门");
hm2.put(new Integer(2), "香港");
hm2.put(new Integer(3), "佛山");
System.out.println(hm1);
System.out.println(hm2);
}
输出:
{1=深圳, 2=广州, 3=惠州2}
{1=江门, 2=香港, 3=佛山}
添加元素之后,如果我们希望更改元素,可以使用put()方法再次添加元素。由于映射中的元素是使用键建立索引的,因此键的值可以通过简单地插入我们想要更改的键的更新值来更改。
实例:
public static void main(String[] args) {
Map<Integer, String> hm1 = new HashMap<>();
hm1.put(new Integer(1), "江门");
hm1.put(new Integer(2), "香港");
hm1.put(new Integer(3), "佛山");
System.out.println("初始Map" + hm1);
hm1.put(new Integer(2),"海南");
System.out.println("修改map 后"+hm1);
}
输出:
初始Map{1=江门, 2=香港, 3=佛山}
修改map 后{1=江门, 2=海南, 3=佛山}
为了从Map中删除一个元素,我们可以使用remove()方法。此方法获取键值,并从该映射中移除某个键的映射(如果该键在映射中存在)。
实例:
public static void main(String[] args) {
Map<Integer, String> hm1 = new HashMap<>();
hm1.put(new Integer(1), "江门");
hm1.put(new Integer(2), "香港");
hm1.put(new Integer(3), "佛山");
System.out.println("初始Map" + hm1);
hm1.remove(2);
System.out.println("删除map 后"+hm1);
}
}
输出:
初始Map{1=江门, 2=香港, 3=佛山}
删除map 后{1=江门, 3=佛山}
有多种方法可以遍历Map。最著名的方法是使用for-each循环来获取键。键的值是通过使用getValue()方法找到的。
实例:
public static void main(String[] args) {
Map<Integer, String> hm1 = new HashMap<>();
hm1.put(new Integer(1), "江门");
hm1.put(new Integer(2), "香港");
hm1.put(new Integer(3), "佛山");
System.out.println("初始Map" + hm1);
for (Map.Entry mapElement : hm1.entrySet()) {
// 获取键
int key = (int)mapElement.getKey();
// 获取值
String value = (String)mapElement.getValue();
System.out.println(key + " : " + value);
}
}
输出:
初始Map{1=江门, 2=香港, 3=佛山}
1 : 江门
2 : 香港
3 : 佛山
Method | Description |
---|---|
V put(Object key, Object value) | 它用于在映射中插入条目。 |
void putAll(Map map) | 它用于在映射中插入指定的映射。 |
V putIfAbsent(K key, V value) | 只有当指定的值没有被指定时,它才会将指定的值与指定的键一起插入到映射中。 |
V remove(Object key) | 用于删除指定键的条目。 |
boolean remove(Object key, Object value) | 它从映射中删除具有关联的指定键的指定值。 |
Set keySet() | 它返回包含所有键的Set视图。 |
Set | 它返回包含所有键和值的Set视图。 |
void clear() | 它用于重置map |
V compute(K key, BiFunction super K,? super V,? extends V> remappingFunction) | 它用于计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。 |
V computeIfAbsent(K key, Function super K,? extends V> mappingFunction) | 如果指定的键尚未与值关联(或映射为空),则使用给定的映射函数计算其值,并将其输入到这个映射中,除非为空 |
V computeIfPresent(K key, BiFunction super K,? super V,? extends V> remappingFunction) | 它用于计算给定键及其当前映射值的新映射,如果指定键的值存在且非空。 |
boolean containsValue(Object value) | 如果映射中存在与该值相等的值,则此方法返回true,否则返回false。 |
boolean containsKey(Object key) | 如果映射中存在与该键相等的键,则此方法返回true,否则返回false。 |
boolean equals(Object o) | 它用于比较指定的对象和映射。 |
void forEach(BiConsumer super K,? super V> action) | 它对映射中的每个条目执行给定的操作,直到处理完所有条目,或者该操作抛出异常。 |
V get(Object key) | 此方法返回包含与键关联的值的对象。 |
V getOrDefault(Object key, V defaultValue) | 它返回指定键映射到的值,如果映射不包含该键的映射,则返回defaultValue。 |
int hashCode() | 它返回Map的散列代码值 |
boolean isEmpty() | 如果映射为空,此方法返回true;如果包含至少一个键,则返回false。 |
V merge(K key, V value, BiFunction super V,? super V,? extends V> remappingFunction) | 如果指定的键没有与值关联或与null关联,则将其与给定的非空值关联。 |
V replace(K key, V value) | 它将替换指定键的指定值。 |
boolean replace(K key, V oldValue, V newValue) | 它将指定键的旧值替换为新值。 |
void replaceAll(BiFunction super K,? super V,? extends V> function) | 它将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理完或该函数抛出异常。 |
Collection values() | 它返回映射中包含的值的集合视图。 |
int size() | 此方法返回映射中的条目数。 |