Java Map接口

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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * 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

 

推荐好课