• java 集合Map


    1. Map集合

    特点:将键映射到值的对象,一个映射不能包含重复的键; 每个键可以映射到最多一个值。无序。

    Map 与 Collection集合的区别

    Map集合存储元素成对出现,双列,Collection是单列的

    Map的键是唯一的,Collection 的子体系Set是唯一的

    Map集合的数据结构针对键有效,与值无关

    Collection的集合的数据结构只针对元素有效

    功能概述:

    1. 添加功能

    V put(K key, V value):添加(修改)功能: 如果该键已经存在,则将值替换,并返回前一个键对应的值,第一次存储,返回Null

    2. 删除功能:

    void clear():移除所有的键值对元素

    V remove(Object key):根据键值对删除元素,并把值返回

    3. 判断功能

    boolean containsKey(Object key):判断集合是否包含指定的键

    boolean containsValue(Object value):判断集合是否包含指定的值

    boolean isEmpty():判断集合是否为空

    4. 获取功能

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

    V get(Object key):根据键获取值

    set<E> keySet():获取集合中所有键的集合

    Collection<V> values():获取集合中所有值的集合

    5. 长度功能

    int size():返回集合键值对的个数

    测试:

        public static void main(String[] args) {
            Map<String, String> map = new HashMap<String, String>();
            System.out.println("put:" + map.put("文章", "马伊利"));
            System.out.println("put:" + map.put("文章", "姚笛")); // 如果该键已经存在,则将值修改,并返回前一个键对应的值
            map.put("wangwang", "xiaojingzi");
            map.put("wangzi", "xiaojunzi");
            map.put("hage", "xiaoha");
            System.out.println("map:" + map);
            System.out.println(map.remove("wangwang")); // 返回键所对应的值:"xiaojingzi"
            System.out.println(map.containsKey("wangzi")); // 存在返回true,不存在返回false
            System.out.println(map.size());
            
            System.out.println(map.get("文章")); // 根据键返回值,不存在返回Null
    
            Set<String> set = map.keySet();        // 返回集合中所有键的结合
            for (String key : set) {
                System.out.println(key);
            }
    
            Collection<String> con = map.values();    // 返回集合中所有值的集合
            for (String value : con) {
                System.out.println(value);
            }
            
            for(String key : set) {                    // map集合的遍历方式1
                System.out.println(key + "=" + map.get(key));
            }
            
            Set<Map.Entry<String, String>> set1 = map.entrySet();  // map集合的遍历方式2
            for(Map.Entry<String, String> me : set1) {
                System.out.println(me.getKey() + ":" + me.getValue());
            }
        }

    2. HashMap类

    特点:键是哈希表的结构,可以保证键的唯一性(依赖hashCode()和equals()方法

    public static void main(String[] args) {
            HashMap<String, String> hm = new HashMap<String, String>();
            hm.put("it001", "马云");
            hm.put("it002", "马化腾");
            hm.put("it003", "乔布斯");
            hm.put("it004", "张朝阳");
            hm.put("it005", "加伯爵)");
            hm.put("it001", "比尔盖茨");
    
            Set<String> set = hm.keySet();
            for(String key : set) {
                String value = hm.get(key);
                System.out.println(key + "------" + value);
            }
        }

    3. LinkedHashMap类

    map接口的哈希表(唯一性)和链表(键有序性)实现,具有可预知的迭代顺序(存储取出顺序一致)

    public static void main(String[] args) {
            LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
            hm.put("1234", "hello");
            hm.put("2345", "java");
            hm.put("3456", "android");
            hm.put("1234", "hello");
            hm.put("2345", "xiaojingzi");
            
            Set<String> set = hm.keySet();
            for (String key : set) {
                String value = hm.get(key);
                System.out.println(key + "------" + value);
            }
        }

    4. TreeMap类

    特点:TreeMap是基于红黑树的Map接口的实现,可以使用自然排序和比较器排序

    public static void main(String[] args) {
            TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {
    
                @Override
                public int compare(Student o1, Student o2) {
                    // 添加比较的方法
                    int num = o1.getAge() - o2.getAge();
                    int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
                    return num2;
                }
                
            });
            
            Student s1 = new Student("潘安", 30);
            Student s2 = new Student("诸葛亮", 38);
            Student s3 = new Student("唐伯虎", 39);
            Student s4 = new Student("春香", 50);
            Student s5 = new Student("唐伯虎", 3);
            
            tm.put(s1, "宋朝");
            tm.put(s2, "唐朝");
            tm.put(s3, "明朝");
            tm.put(s4, "清朝");
            tm.put(s5, "清朝");
            
            System.out.println(tm);
            Set<Map.Entry<Student, String>> set = tm.entrySet();
            for (Map.Entry map : set) {
                System.out.println(map.getKey() + "-------" + map.getValue());
            }
        }

    例:统计输入字符串的字符的个数:

        public static void main(String[] args) {
            TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个字符串");
            String line = sc.nextLine();
            char[] chs = line.toCharArray();
            for (char ch : chs) {
                Integer i = tm.get(ch);
                if(i == null) {
                    tm.put(ch, 1);
                }else {
                    i++;
                    tm.put(ch, i);
                }
            }
            StringBuilder sb = new StringBuilder();
            Set<Character> set = tm.keySet();
            for (Character key : set) {
                Integer value = tm.get(key);
                sb.append(key).append("(").append(value).append(")");
            }
            
            String result = sb.toString();
            System.out.println("result:" + result);
        }

     例:多重嵌套

        public static void main(String[] args) {
            HashMap<String, HashMap<String, Integer>> hmap = new HashMap<String, HashMap<String, Integer>>();
            HashMap<String, Integer> smap = new HashMap<String, Integer>();
            smap.put("wangjing", 20);
            smap.put("wangjun", 21);
            HashMap<String, Integer> amap = new HashMap<String, Integer>();
            amap.put("xiaojingzi", 19);
            amap.put("xiaojunzi", 18);
            hmap.put("daming", smap);
            hmap.put("xiaoming", amap);
            
            Set<String> set = hmap.keySet();
            for (String k : set) {
                HashMap<String, Integer> ap = hmap.get(k);
                Set<String> st = ap.keySet();
                System.out.println("--------" + k + "-----");
                for(String sc : st) {
                    System.out.println(sc + "-----" + ap.get(sc));
                }
            }       
        }

    Hashtable和HashMap的区别:

    Hashtable:线程安全,效率低,不允许null键和null值

    HashMap:线程不安全,效率高,允许null键和null值

  • 相关阅读:
    BZOJ1787 [Ahoi2008]Meet 紧急集合[结论题]
    poj3728 The merchant[倍增]
    poj2750 Potted Flower[线段树]
    poj2482 Stars in Your Window[扫描线]
    poj2182 Lost Cows[BIT二分]
    UVA12096 The SetStack Computer
    第05组(65) 需求分析报告
    团队介绍与选题报告
    数据采集技术第三次作业
    结对编程作业
  • 原文地址:https://www.cnblogs.com/feng-ying/p/9419761.html
Copyright © 2020-2023  润新知