Map 接口

常用方法

  • public V put(K key,V value);重复返回被替换的值,不重复返回null
  • public V remove(Object key);返回被删除的key对应的value,如果不存在key,返回null
  • public V get(Object key)//返回key对应的value,如果不存在key,返回null
  • boolean containsKey(Object key)//存在key返回true,不存在返回false

HashMap实现了Map接口

  • 多线程集合,速度快

遍历方法

  • keySet()//键的集合

    • //以set集合方式返回map所有的key;使用迭代器或者增强for循环去遍历

    • for(K key in map.keySet()){

      System.out.println(map.get(key));

    • }

  • Map.Entry<K k,V v> //键值对

    • Map接口中的Entry接口,为键值对接口

    • Map集合创建的的时候会创建的Entry对象,记录键与值

    • Set<Map.Entry<K,V>> entrySet() //返回键值对对象

    • 示例

    • Set<Map.Entry<String,Interger>> kv=Map.entrySet();
      for (Map.Entry<String, Interger>> k :kv){
             
      	System.out.println(k.getKey()+"="+k.getValue())
          
      }
      
  • HashMap存储自定义对象需要维持key的唯一,因此需要重写equals和hashCode方法

LinkHashMap继承自HashMap,方法相同,但LinkHashSet可以记录元素的顺序

HashTable

  • 实现了Map接口,key’和value都不允许存储null值,其他类型可以

  • @since JDK1.0

  • 同步单线程的

  • 1.2之后被主流行HashMap

  • Vector也是1.2之后被ArrayList所取代

  • 底层是个哈希表

  • HashTable的子类Properties是一个唯一和IO流相结合的集合

Map集合练习

  • 统计用户输入字符的个数
public static int count(String s){
   
        Map<Character,Integer> m=new HashMap<>();
        for (int i=0;i<s.length();i++){
   
            if(m.get(s.charAt(i))==null){
   
                m.put(s.charAt(i),1);//不存在该键,m增加该键并赋值为1

            }else{
   
                int value=m.get(s.charAt(i));//
                value++;
                m.put(s.charAt(i),value);
            }
        }
        for(Character c: m.keySet()){
   
            System.out.println(c+"="+m.get(c));
        }
        return 0;
    }