Java Map接口
精华
小牛编辑
174浏览
2023-03-14
1 什么是Java Map接口
Map包含基于键的值,即包含键值对(key-value)。每个键和值对称为一个Entry。Map包含唯一的key。
如果我们的需求是必须基于Key来搜索,更新或删除元素,则“Map”很有用。
2 Java Map接口层次结构
有两个在Java中实现Map的接口:Map和SortedMap,以及三个类:HashMap,LinkedHashMap和TreeMap。Java Map的层次结构如下:
Map不允许重复的key键,但是您允许有重复的value值。HashMap和LinkedHashMap允许空键和值,但是TreeMap不允许任何空键或值。
Map是不能直接遍历的,我们需要使用keySet() 或entrySet() 方法将其转换为Set再进行遍历。
方法 | 描述 |
---|---|
HashMap | HashMap是Map的实现,但存储的元素是无序的。 |
LinkedHashMap | LinkedHashMap是Map的实现。它继承了HashMap类。它的元素是有序的(按插入顺序)。 |
TreeMap | TreeMap是Map和SortedMap的实现。它的元素是有序的(按升序)。 |
3 Java Map接口的常用方法
方法 | 描述 |
---|---|
V put(Object key, Object value) | 用于在Map中插入一对key-value。 |
void putAll(Map map) | 用于在Map中插入指定的Map。 |
V putIfAbsent(K key, V value) | 只有当指定value和指定key不存在于当前Map时,才将其插入。 |
V remove(Object key) | 用于根据key删除指定的条目。 |
boolean remove(Object key, Object value) | 从Map中删除指定key和value的条目。 |
Set keySet() | 返回包含所有key的Set集合。 |
Set<Map.Entry<K,V>> entrySet() | 返回包含所有key和value的Set集合。 |
void clear() | 用于清空Map。 |
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 用于计算指定key及其当前映射值的Map(如果没有当前Map,则为null)。 |
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) | 如果指定的key尚未与value关联(或已映射为null),则使用给定的映射函数计算它的值,除非为null,否则将其输入到此Map中。 |
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 如果指定key的值存在且非空,则用于给定key及其当前映射值的情况下计算新Map。 |
boolean containsValue(Object value) | 如果Map中存在等于该值的某个值,则此方法返回true,否则返回false。 |
boolean containsKey(Object key) | 如果Map中存在等于该key的条目,则此方法返回true,否则返回false。 |
boolean equals(Object o) | 用于将指定的Object与Map进行比较。 |
void forEach(BiConsumer<? super K,? super V> action) | 对Map中的每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常为止。 |
V get(Object key) | 返回根据key获取对应的value对象。 |
V getOrDefault(Object key, V defaultValue) | 返回根据key获取对应的value对象,如果Map不包含key的数据,则返回默认值defaultValue。 |
int hashCode() | 返回Map的哈希码值 |
boolean isEmpty() | 如果映射为空,则此方法返回true;否则,返回false。如果包含至少一个key,则返回false。 |
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 如果指定的key尚未与value关联或与null关联,将其与给定的非null值关联。 |
V replace(K key, V value) | 将指定的value替换为指定的key。 |
boolean replace(K key, V oldValue, V newValue) | 用指定key的新值替换旧值。 |
void replaceAll(BiFunction<? super K,? super V,? extends V> function) | 用在该条目上调用给定函数的结果替换每个条目的值,直到处理完所有条目或该函数引发异常为止。 |
Collection values() | 返回Map中所有value值对象封装的集合。 |
int size() | 返回Map的元素个数。 |
4 什么是Map.Entry接口
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey() 获取key , getValue()获取value方法。
5 Map.Entry接口的方法
方法 | 描述 |
---|---|
K getKey() | 用于获取key。 |
V getValue() | 用于获取value。 |
int hashCode() | 用于获取hashCode。 |
V setValue(V value) | 用于用指定值替换与该条目对应的值。 |
boolean equals(Object o) | 用于将指定对象与其他现有对象进行比较。 |
static <K extends Comparable<? super K>,V> Comparator<Map.Entry<K,V>> comparingByKey() | 返回一个比较器,该比较器以键上的自然顺序比较对象。 |
static <K,V> Comparator<Map.Entry<K,V>> comparingByKey(Comparator<? super K> cmp) | 返回一个比较器,该比较器使用给定的Comparator通过键比较对象。 |
static <K,V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() | 返回一个比较器,该比较器以自然顺序对值进行比较。 |
static <K,V> Comparator<Map.Entry<K,V>> comparingByValue(Comparator<? super V> cmp) | 返回一个比较器,该比较器使用给定的Comparator通过值比较对象。 |
6 Java Map的例子:非泛型
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
//非泛型的例子
import java.util.*;
public class Demo {
public static void main(String[] args) {
Map map=new HashMap();
//添加元素到Map
map.put(1,"Eric");
map.put(5,"Jack");
map.put(2,"Mark");
map.put(6,"Rose");
//遍历Map
Set set=map.entrySet();//获取Entry的Set集合
Iterator itr=set.iterator();
while(itr.hasNext()){
Map.Entry entry=(Map.Entry)itr.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
输出结果为:
1 Eric
2 Mark
5 Jack
6 Rose
7 Java Map的例子:泛型
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
//泛型的例子
import java.util.*;
class Demo{
public static void main(String args[]){
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Paul");
//遍历元素
for(Map.Entry m:map.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
输出结果为:
100 Eric
101 Jack
102 Paul
8 Java Map的例子:compareByKey()
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
import java.util.*;
class Demo{
public static void main(String args[]){
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Mark");
//返回Map中所有Entry的Set视图
map.entrySet()
//返回以Map为源的顺序Stream
.stream()
//根据提供的比较器排序
.sorted(Map.Entry.comparingByKey())
//对此流的每个元素执行一个操作
.forEach(System.out::println);
}
}
输出结果为:
100=Eric
101=Jack
102=Mark
9 Java Map的例子:降序compareByKey()
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
import java.util.*;
class Demo{
public static void main(String args[]){
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Rose");
//返回Map包含的Entry的Set视图
map.entrySet()
//返回以Map为源的顺序Stream
.stream()
//根据提供的比较器排序
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
//对此流的每个元素执行一个操作
.forEach(System.out::println);
}
}
输出结果为:
102=Rose
101=Jack
100=Eric
10 Java Map的例子:compareByValue()
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
import java.util.*;
class Demo{
public static void main(String args[]){
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Lucas");
//返回Map中包含的Entry的Set视图
map.entrySet()
//返回以Map为源的顺序Stream
.stream()
//根据提供的比较器排序
.sorted(Map.Entry.comparingByValue())
//对此流的每个元素执行一个操作
.forEach(System.out::println);
}
}
输出结果为:
100=Eric
101=Jack
102=Lucas
11 Java Map的例子:降序比较
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* Java Map.Entry的例子
*/
import java.util.*;
class Demo{
public static void main(String args[]){
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Rose");
map.put(102,"Lucy");
//返回Map包含的Entry的Set视图
map.entrySet()
//返回以Map为源的顺序Stream
.stream()
//根据提供的比较器排序
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
//对此流的每个元素执行一个操作
.forEach(System.out::println);
}
}
输出结果为:
101=Rose
102=Lucy
100=Eric