java基础(十):Map映射

Map映射

  • public interface Map<K,V>

  • 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

  • 类型参数:

    • K - 此映射所维护的键的类型
    • V - 映射值的类型
  • 实现类:HashMap、Hashtable、LinkedHashMap

  • 总结:

    1. Map存储的是键值对及他们之间的映射关系
    2. Map的key不能重复
    3. Map中每个key只能对应一个value

方法

  1. V put(K key, V value):将指定的值与此映射中的指定键关联(可选操作)。

    1. 如果map中已经存在当前key,调用put方法添加则会覆盖之前的Value值;

    2. 如果map中没有当前添加的key,则返回值为null;如果map中已经存在当前key,返回值为被覆盖掉的值;

  2. void clear(): 从此映射中移除所有映射关系(可选操作)。

  3. boolean containsKey(Object key):如果此映射包含指定键的映射关系,则返回 true。

  4. boolean containsValue(Object value): 如果此映射将一个或多个键映射到指定值,则返回 true。

  5. V get(Object key): 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null

  6. boolean isEmpty():如果此映射未包含键-值映射关系,则返回 true。

  7. Set<K> keySet():返回此映射中包含的键的 Set 视图

    返回值是Set集合的原因是:Map的key是唯一的

  8. Collection<V> values():返回此映射中包含的值的 Collection 视图

  9. V remove(Object key):如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

  10. int size():返回此映射中的键-值映射关系数。

  11. Set<Map.Entry<K,V>> entrySet():返回此映射中包含的映射关系的 Set 视图。

在这里插入图片描述

public class MapDemo2 {
    public static void main(String[] args) {
        // 创建Map的对象
        Map<String,Integer> map = new HashMap<String,Integer>();
        // put() 添加元素
        System.out.println(map.put("001",28));  // null
        System.out.println(map.put("002",17));  // null
        System.out.println(map.put("001",60));  //28
        // 编译不报错,如果重复则对value进行覆盖

        // 重写toString() Key = Value
        System.out.println(map);  // {001=60, 002=17}

        // containsKey()
        System.out.println(map.containsKey("002"));  // true
        // containsValue()
        System.out.println(map.containsValue(28));  // false

        // equals()
        Map<String, Integer> copyMap = new HashMap<String,Integer>();
        copyMap.putAll(map);
        System.out.println(map.equals(copyMap));  // true

        // get(key)
        int num = map.get("001");  // 自动拆箱
        // int num1 = map.get("008");  // error
        // map.get("008"); 返回null
        // 自动拆箱时调用 null.intValue() -- > 空指针异常
        System.out.println(map.get("008"));  // null

        // Set<K> keySet():将key值放入一个Set
        Set<String> keys = map.keySet();
        // Values(): 返回values形成的集合
        Collection<Integer> col = map.values();
        System.out.println(keys+"\n"+col);

        // remove(key)
        int tmp = copyMap.remove("001");
        System.out.println(tmp);

        // size()
        System.out.println(map.size());
    }
}

如何遍历Map

  • 方案一:
    1. KeySet获取所有key的Set
    2. 遍历Set集合
    3. 根据key的值获取对应的value
  • 方案二:
    1. 调用entrySet()获取代表Map键值对的Entry对象的Set集合
    2. 遍历Set集合
    3. 调用Entry的方法,分别获取Key,Value
      • K getKey():返回与此项对应的键。
      • V getValue(): 返回与此项对应的值 。
// 遍历
// 方案一:
// 1. keySet 获取所有key的set集合
Set<String> keys = map.keySet();
// 2. 遍历set集合
for (String str: keys){
    // 3. 根据key的值获取对应value
    System.out.println(str+"="+map.get(str));
}
// 方案二:
// 1. 调用entrySet()获取代表Map键值对的Entry对象的Set集合
Set<Map.Entry<String,Integer>> entries = map.entrySet();
// 2.遍历Set集合
for (Map.Entry<String,Integer> entry : entries){
    // 3. 调用Entry的方法,分别获取Key,Value
    System.out.println(entry.getKey() + "=" + entry.getValue());
}
// 简化版
for(Map.Entry<String,Integer> entry: map.entrySet()){
    System.out.println(entry.getKey() + "=" + entry.getValue());
}

HashMap

  • 基于数组&链表实现

在这里插入图片描述

  • HashMap底层为了提高效率,会做相应的优化

  • JDK1.8,当链表的链长超过8时,转成红黑树;删除元素后,当链表的长度小于6时,又转回链表

  • HashMap的key可以为null,但是只有一个;HashMap的value可以为null,不限制个数

  • 异步式线程不安全

  • 构造方法:

  • HashMap():构造一个具有默认初始容量 (16) 和默认加载(负载、装载)因子 (0.75) 的空 HashMap;当超过16*0.75=12时开始扩容,每次扩容一倍

  • 方法:无特殊方法

Hashtable

  • 从以下版本开始: JDK1.0
  • 特点:键值都不能为null
  • 同步式线程安全
  • 构造方法
    • Hashtable() :用默认的初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表。
public class HashtableDemo {
    public static void main(String[] args) {
        // 创建对象 Hashtable
        Hashtable<String,Integer> table = new Hashtable<String, Integer>();
        //
        table.put("start",12);  // 自动装箱
        table.put("hello",15);
        table.put("java",30);

        System.out.println(table);

        // 遍历
        // 1. 迭代器 elements,只能输出value
        Enumeration<Integer> ele = table.elements();
        Enumeration<String> keys = table.keys();
        while(keys.hasMoreElements()){
            System.out.println(keys.nextElement() + "=" + ele.nextElement());
        }
        // 2. entrySet()
        Set<Map.Entry<String,Integer>> entries = table.entrySet();
        for(Map.Entry<String,Integer> entry: entries){
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
        // 简化版
        for(Map.Entry<String,Integer> entry: table.entrySet()){
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }
}

HashMap和Hashtable的区别:

  1. HashMap JDK1.2;Hashtable JDK1.0

  2. HashMap 初始容量为16,加载因子0.75;扩容每次扩容一倍;

    Hashtable 初始容量为11,加载因子0.75;扩容每次扩容一倍+1;

  3. HashMap 异步式线程不安全,效率高

    HashTable 同步式线程安全,效率低

  4. HashMap 键值可以为null,键只能有一个null

    Hashtable 键值都不能为null

注意:HashMap和Hashtable都是无序的,LinkedHashMap能够保证存入的顺序

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值