Map接口详解

Map接口详解


一. Map定义

接口Map<K,V>

类型参数:
K- 此映射所维护的键的类型
V- 映射值的类型

  • 映射的数学解释:
    • 设A、B是两个非空集合,如果存在一个法则f,使得对A中的每个元素a,按法则f,在B中有唯一确定的元素b与之对应,则称f为从A到B的映射,记作f:A→B。
    • 映射关系(两个集合):A集合和B集合. A集合中的每一个元素都可以在B集合中找到唯一的一个值与之对应.
    • 严格上说,Map并不是集合,而是两个集合之间的映射关系(Map接口并没有继承于Collection接口)
      然而因为Map可以存储数据(每次存储都应该存储A集合中以一个元素(key),和B集合中一个元素(value)),我们还是习惯把Map也称之为集合.
      这里写图片描述

  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的value,key和value都是可以任意引用类型的数据。Map的key不允许重复,即统一个Map对象的任何两个key通过equals方法比较总是返回false.
  给key-value起个名字:Entry,表示一个键值对,对应Map的一个实体;把Entry放到集合set中就是一个Map
  如果把Map所有value放在一起来看,元素与元素之间可以重复,每个元素可以根据索引来查找,相当于list集合,只是Map中的索引不再使用整数值,而是以另外一个对象作为索引。如果需要从List集合中取出元素,需要提供该元素的数字索引。
  如果需要从Map中取出元素,需要提供该元素的key索引,因此,Map也被称为字典。

二. Map的部分方法:

  1. void clear():删除该Map对象中所有key-value对
  2. boolean containsKey(Object key):查询Map中是否包含一个或多个value,如果包含则返回true。
  3. boolean containsValue(Object value):查询Map中是否包含一个或者多个value,如果包含则返回true
    4.Set entrySet():返回Map中所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
  4. Object get(Object key):返回指定key所对应的value,如果此Map中不包含该key,则返回null。
  5. boolean isEmpty():查询Map是否为空(即不包含任何key-value对),如果为空就返回true。
  6. Set keySet():返回该Map中所有key所组成的Set集合。
  7. Object put(Object key,Object value):添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。
  8. void putAll(Map m ):将指定Map中的key-value对复制到本Map中。

  Map接口提供了大量的实现类,典型实现如下:

HashMap:

采用哈希表算法, 此时Map中的key不会保证添加的先后顺序,key也不允许重复.key判断重复的标准是: key1和key2是否equals为true,并且与hashCode相等.

TreeMap:

采用红黑树算法,此时Map中的key会按照自然顺序或定制排序进行排序,,key也不允许重复.key判断重复的标准是: compareTo/compare的返回值是否为0.

LinkedHashMap:

采用链表和哈希表算法,此时Map中的key会保证先后添加的顺序,key不允许重复.key判断重复的标准和HashMap中的key的标准相同.

Hashtable:

采用哈希表算法,是HashMap的前身(类似于Vector是ArrayList的前身).打死不用.
在Java的集合框架之前,表示映射关系就使用Hashtable.所有的方法都使用synchronized修饰符,线程安全的,但是性能相对HashMap较低.

Properties:

Hashtable的子类,此时要求key和value都是String类型.
用来加载资源文件(properties文件).

这里写图片描述

一般的,我们定义Map,key都使用不可变的类(String),把key作为value的唯一名称.
HashMap和TreeMap以及LinkedHashMap都是线程不安全的,但是性能较高:

解决方案:
Map m = Collections.synchronizedMap(Map对象);
Hashtable类实现线程安全的,但是性能较低.
哈希表算法:做等值查询最快.
数结构算法:做范围查询最快–>应用到索引上.

三. Map小例

  import java.util.Collection;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.Set;
  public class MapCommonDemo {
  public static void main(String[] args) {
        Map<String,Object> map = new HashMap();
        map.put("key_1","溶酶菌");
        map.put("key_2","二菌");
        map.put("key_3","三菌");
        map.put("key_4","可爱的菌");
        map.put("key_5","菌");
        map.put("key_5", "小小菌");//覆盖前面的key
        System.out.println("HashMap:——>"+map);
        System.out.println("—————————————————————");
        System.out.println("通过key值寻找——>"+map.containsKey("key_5"));
        System.out.println("通过val值寻找——>"+map.containsKey("溶酶菌"));
        System.out.println("获取key_2对应的值——>"+map.get("key_2"));
        System.out.println("—————————————————————");

        Set<String> keys = map.keySet();
        System.out.println("调用keySet方法.获取map中的key值组成的集合");
        for( String key:keys ){
            System.out.println(key+"——>"+map.get(key));
        }

        Collection<Object> values = map.values();
        System.out.println("—————————————————————");
        System.out.println("获取map中所有的value");
        for( Object value:values ){
            System.out.println(value);
        }

        Set< Map.Entry<String,Object>> entrys = map.entrySet();
        System.out.println("—————————————————————");
        System.out.println("获取map中的键值对,key-value");
        for( Map.Entry<String,Object> entry:entrys){
            String key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(key+"——>"+value);
        }
     }
  }  

运行结果:

HashMap:——>{key_3=三菌, key_2=二菌, key_1=溶酶菌, key_5=小小菌, key_4=可爱的菌}
—————————————————————
通过key值寻找——>true
通过val值寻找——>false
获取key_2对应的值——>二菌
—————————————————————
调用keySet方法.获取map中的key值组成的集合
key_3——>三菌
key_2——>二菌
key_1——>溶酶菌
key_5——>小小菌
key_4——>可爱的菌
————————————————————
获取map中所有的value
三菌
二菌
溶酶菌
小小菌
可爱的菌
—————————————————————
获取map中的键值对,key-value
key_3——>三菌
key_2——>二菌
key_1——>溶酶菌
key_5——>小小菌
key_4——>可爱的菌

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

public class HashMapDemo {
public static void main(String[] args) {
Map<String,Object >  map = new HashMap<>(); 
    map.put("r", "r_value");
    map.put("P", "P_value");
    map.put("n", "n_value");
    map.put("g", "g_value");
    map.put("5", "5_value");
    map.put("1ctvnt", "1ctvnt_value");
    System.out.println("HashMap:                   "+map);
    Map<String,Object >  map2 = new TreeMap<>();    
    map2.put("r", "r_value");
    map2.put("P", "P_value");
    map2.put("n", "n_value");
    map2.put("g", "g_value");
    map2.put("5", "5_value");
    map2.put("1ctvnt", "1ctvnt_value");
    System.out.println("TreeMap:                   "+map2);
    Map<String,Object >  map3 = new LinkedHashMap<>();  
    map3.put("r", "r_value");
    map3.put("P", "P_value");
    map3.put("n", "n_value");
    map3.put("g", "g_value");
    map3.put("5", "5_value");
    map3.put("1ctvnt", "1ctvnt_value");
    System.out.println("LinkedHashMap: "+map3);
}
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值