zoukankan      html  css  js  c++  java
  • Java笔记(二十三)……Map集合

    Map接口

    Map<K,V>

    该集合存储的是键值对,成对往集合里存,而且要保证键的唯一性

    常用方法

    添加

    V
    put(K key, V value)

    void
    putAll(Map<? extends K,? extends V> m)

    删除

    void
    clear()

    V
    remove(Object key)

    判断

    boolean
    isEmpty()

    boolean
    containsKey(Object key)

    boolean
    containsValue(Object value)

    获取

    V
    get(Object key)

    int
    size()

    Set<Map.Entry<K,V>>
    entrySet()

    Set<K>
    keySet()

    Map集合的两种取出方式

    第一种:Set<K> keySet

    将Map中的所有键存入到Set集合中。

    因为Set具备迭代器,可以迭代方式遍历所有的键

    再通过Map的get方法获取对应的value

    第二种:Set<Map.Entry<K,V>> entrySet()

    将Map集合中的映射关系存放到Set集合中

    而这个映射关系我们称之为Map.Entry

    Entry其实就是Map中的一个静态内部接口

     

       1: public static void main(String[] args) 
       2: {
       3:     //创建一个HashMap集合
       4:     Map<String,String> m = new HashMap<String,String>();
       5:     
       6:     //存入一些键值对
       7:     m.put("1","A");
       8:     m.put("2","B");
       9:     m.put("3","C");
      10:  
      11:     //获取存放键值对的Set集合
      12:     Set<Map.Entry<String,String>> se = m.entrySet();
      13:     
      14:     //获取Set集合的迭代器
      15:     Iterator<Map.Entry<String,String>> ie = se.iterator();
      16:     
      17:     //遍历读取集合中的键值对,并打印
      18:     while(ie.hasNext())
      19:     {
      20:         Map.Entry<String,String> me = ie.next();
      21:         System.out.println("num = "+me.getKey()+"; name = "+me.getValue());
      22:     }
      23: }

    Map子类

    HashTable

    底层的数据结构是哈希表

    不可以存入null键null值,线程同步,效率低,后期被HashMap取代

    HashMap

    底层的数据结构是哈希表

    允许存入null键null值,线程不同步

    TreeMap

    底层的数据结构是二叉树

    线程不同步,可以用于给map集合中的键进行排序(通过比较器或者自然排序)

    Set集合底层应用的就是TreeMap集合

    Map扩展知识

    Map集合都是被使用到映射关系上

    所以,存在一对多的映射关系,如下:

    Map<String,Map<String,String>>

    Map<String,List<Student>>

    Map应用

    字符串统计字数

       1: /*
       2: 
       3: "abcabcdea"
       4: 打印字母出现的次数
       5: 例子 a(3) b(2)
       6: */
       7: import java.util.*;
       8: class MapTest 
       9: {
      10:     public static void main(String[] args) 
      11:     {
      12:         //测试字符串
      13:         String s = "abcabc123dea";
      14:         
      15:         //创建Map对象存放对应字母
      16:         Map<Character,Integer> map = new TreeMap<Character,Integer>();
      17:         
      18:         //循环遍历字符串
      19:         for(int i = 0 ; i < s.length() ; i ++)
      20:         {
      21:             //建立char的对象封装字母
      22:             Character c = new Character(s.charAt(i));
      23:                 
      24:             //如果包含该字母,对应value+1,否则存入该新的键值对,value为1,代表次数为1
      25:             if(map.containsKey(c))
      26:             {
      27:                 map.put(c,map.get(c)+1);
      28:             }
      29:             else
      30:                 map.put(c,1);
      31:         }
      32:  
      33:         //取出对应关系,并打印
      34:         Set<Map.Entry<Character,Integer>> entrySet = map.entrySet();
      35:  
      36:         Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
      37:  
      38:         while(it.hasNext())
      39:         {
      40:             Map.Entry<Character,Integer> entry = it.next();
      41:             Character c = entry.getKey();
      42:             Integer i = entry.getValue();
      43:             System.out.println(c+"("+i+")");
      44:         }    
      45:     }
      46: }

  • 相关阅读:
    织梦标签调用:根据特定需求调用文章的标签代码
    织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!
    javascript中的this和e.target的深入研究
    vue-cli入门(二)——项目结构
    Mysql千万级大数据量查询优化
    MySQL大数据量分页查询方法及其优化
    Spring Bean的生命周期分析
    多线程下,两个线程交替打印0 -100,使用wait()和notify()
    ReentrantLock
    多线程交替打印ABC的多种实现方法
  • 原文地址:https://www.cnblogs.com/ShawnWithSmallEyes/p/3382517.html
Copyright © 2011-2022 走看看