zoukankan      html  css  js  c++  java
  • Map集合。

    Map集合:

    java.util,Map<k,v> 

    特点:1、键值对 2、key-value一一对应 3、key不允许重复。

    Map常用实现类:

    java.util.HashMap<k,v> 集合  implement Man<k,v> 接口。

    HashMap的特点:1、HashMap集合,底层是哈希表,查询速度快。

            2、jdk8之前, 数组+单向链表。 之后:数组+单项链表/红黑树

            3、无序集合。

    java.util.LinkedHashMap<k,v> 集合  extends HashMap<k,v>

    LinkedHashMap 特点:1、底层-- 哈希表+链表,  所以是有序集合。

    Map常用方法:

     public static void main(String[] args) {
            //public V put(K key,V value)
            //k不重复,返回值V是null
            //k重复,覆盖value,返回被替换的值。
            Map<String,String> hashMap=new HashMap<>();
            hashMap.put("张玉昊","胡云钰");
            hashMap.put("天","云");
            System.out.println(hashMap);
            // public V remove (Object key):删除指定键对应的元素。
            //返回值 V:
            // key 存在, 返回被删除的值。 否则返回null。
            hashMap.remove("天");
            System.out.println(hashMap);
            // public V get(Object key) 根据键获取值
            //key存在,返回对应的值,否则null
            System.out.println(hashMap.get("张玉昊"));
            //bool containskey(Object key) 是否包含指定键
            System.out.println(hashMap.containsKey("张玉昊"));
        }

    遍历Map集合:

    第一种方式:

      public static void main(String[] args) {
            Map<String,String> hashMap=new HashMap<>();
            hashMap.put("张玉昊","胡云钰");
            hashMap.put("天","云");
            //Map集合的第一种方式:通过键找值
            //Map集合中的方法:Set<K> keySet()
            //实现步骤:
            //1、keySet()把Map集合的所有key取出来,存到一个Set集合中
            //2、遍历set集合,找到key,通过key找value.
    
            //Set<String> set= hashMap.keySet();
            for(String key : hashMap.keySet()){
                System.out.println(hashMap.get(key));
            }
        }

    第二种方式:

     public static void main(String[] args) {
            Map<String,String> hashMap=new HashMap<>();
            hashMap.put("张玉昊","胡云钰");
            hashMap.put("天","云");
            //Map集合的第二种方式:通过Entry对象遍历(键值对对象)
            //Map集合中的方法:
            //Set<Map.Entry<K,V> entrySet() 返回映射中包含的
            //映射关系的Set视图。
            //实现步骤;
            //1、entrySet()方法,把Map中的多个Entry对象存入Set集合。
            //2、遍历Set集合,获取每个Entry对象
            //3、使用getKey() and  getValue() 获取键值。
            for (Map.Entry<String,String> entry:hashMap.entrySet()){
                System.out.println(entry.getKey()+"--"+entry.getValue());
            }
        }

    Hash Map存储自定义类型:

      //HashMap存储自定义类型的键值
        //Map集合保证key唯一:
        //所以,作为key的元素,必须重写hashCode()和equals()
        public static void main(String[] args) {
            show2();
        }
    
        public static void show1(){
            //Key: String类型
                //String类重写了hashCode()and equals(),所以key唯一
            //Value:Person类型
                //value可以重复。
            Map<String,Person> hashMap=new HashMap<>();
            hashMap.put("四川",new Person("Sam",16));
            hashMap.put("上海",new Person("Penny",19));
            hashMap.put("四川",new Person("instead",17));
            for (String set:hashMap.keySet()){
                System.out.println(set+"--"+
                        hashMap.get(set));
            }
            //因为四川重复了,所以第一个被覆盖。
        }
        public static void show2(){
            //Key: Person类型
                //必须重写hashCode 和 equals
            //value:String
                //可重复。
            HashMap<Person,String> hashMap=new HashMap<>();
            hashMap.put(new Person("天",21),"川农");
            hashMap.put(new Person("云",22),"宜院");
            hashMap.put(new Person("天",21),"川农1");
            for (Map.Entry<Person,String> entry:hashMap.entrySet()){
                System.out.println(entry.getKey()+"--"+entry.getValue());
            }
            //重写前:
            //Person{name='天', age=21}--川农
           //Person{name='天', age=21}--川农1
            //Person{name='云', age=22}--宜院
            //重写后:
            //Person{name='天', age=21}--川农1
           // Person{name='云', age=22}--宜院
        }

    LinkedHashMap:

    java.util.LinkedHashMap<K,V> extend HashMap<K,V>

    底层:哈希表+链表  有序。

    public static void main(String[] args) {
           LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();
           linkedHashMap.put("a","a");
           linkedHashMap.put("c","c");
           linkedHashMap.put("b","b");
            System.out.println(linkedHashMap);
            //{a=a, c=c, b=b}
        }

    HashTable集合:

    java.util.Hashtable<K,V> implements Map<K,V>

      Hashtable: 底层哈希表,是线程安全的集合,单线程,速度慢。

      HashMap:底层哈希表,是线程不安全的集合,多线程,速度快。

      -----------

      HashMap:可null键,null值

      Hashtable:不可以。

      ------

      Hashtable 和 Vector ,jdk1.2后,被 HashMap和ArrayList取代

      但,Hashtable的子类,Properties,还在用。

      Properties集合是唯一和IO结合的集合。

    Map集合练习:

    判断字符串每个字符出现个数:

    public static void main(String[] args) {
           LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();
           linkedHashMap.put("a","a");
           linkedHashMap.put("c","c");
           linkedHashMap.put("b","b");
            System.out.println(linkedHashMap);
            //{a=a, c=c, b=b}
        }

    JDK9 对集合的优化  of 方法:

    public static void main(String[] args) {
            //List,Set,Map 接口,添加了一个静态方法,可一次性添加多个元素。
            //static <E> List<E> of (E...elements)
            //使用前提:
                //集合元素固定,不会再改变时。
            //注意:
                //1、of方法,只用于,List,Set,Map接口,不适用于实现类。
                //2、of 的返回值是一个不能改变的集合,不能再用put  add
                //3、Set 和Map接口在调用of时,不能有重复的元素。
            List<String> list=List.of("a","b","c");
            System.out.println(list);
        }
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/zhangyuhao/p/10761516.html
Copyright © 2011-2022 走看看