Map集合相关

前提是你 提交于 2020-02-05 02:38:14

F:\IdeaProjects\baisc-codeII\day04-code

Map集合概述

Map集合是一个双列集合,一个集合包含两个值,Key和Value;
key不能重复,一个key对应一个value;
常用的有HashMap集合和LinkedHashMap集合。
HashMap<K,V>:存储数据采用的是哈希表结构,元素存取顺序不一致。
LinkedHashMap<K,V>:是HashMap的子类,存储数据采用的是哈希表+链表,链表保证了元素存取数据顺序一致。
二者都重写了hashCode()和equals()方法,来保证key的唯一性,区别是有序和无序,本篇所有示例均为HashMap集合。

常用方法

put(key,value):如果key不重复,返回值V是null;如果重复,会使用新的value替换重复的value,并返回旧value;
remove(key):如果key存在,返回被删除的value,如果不存在,返回null;
get(key):如果key存在,返回对应的值,不存在返回null;
containsKey(key):包含返回true,不包含返回false;

Map集合遍历

主要有两种遍历方式
方式1:通过键找值的方式
1.使用map集合中的方法keySet(),把Map集合中所有的key取出来,存储到一个set集合中
2.遍历set集合,获取每一个键
3.通过get(key),找到value

public class Demo02Bianli {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("李晨", "范冰冰1");
        map.put("C罗", "伊莲娜");
        map.put("梅西", "安东尼");
        map.put("杨过", "范冰冰1");
        System.out.println(map);//我打印这个Map集合看一下,结果:{杨过=范冰冰1, C罗=伊莲娜, 李晨=范冰冰1, 梅西=安东尼}

        Set<String> set = map.keySet();
        System.out.println(set);//打印获取到的Set集合看一下[杨过, C罗, 李晨, 梅西]

        Iterator<String> it=set.iterator();//遍历set集合方法一
        while (it.hasNext()){
            String key=it.next();
            System.out.println(map.get(key));//通过key获取value
        }

        for (String s : set) {//遍历set集合方法二
            System.out.println(map.get(s));
        }
    }

方式2:使用Entry对象遍历(Entry,用来记录键与值的映射关系)
1.使用map中的entryset()把map集合中的多个entry对象取出来,存储到一个Set集合中
2.遍历set集合,获取每一个entry对象
3.使用entry对象中的getKey方法和getValue()方法获取键与值

Set<Map.Entry<String, String>> set = map.entrySet();
 System.out.println(set);//结果[杨过=范冰冰1, C罗=伊莲娜, 李晨=范冰冰1, 梅西=安东尼],注意是[]set集合
 Iterator<Map.Entry<String, String>> it = set.iterator();
 while (it.hasNext()){
     Map.Entry<String, String> entry = it.next();
     System.out.println(entry.getKey()+entry.getValue());
 }

 for (Map.Entry<String, String> entry : map.entrySet()) {
     System.out.println(entry.getKey()+entry.getValue());
 }

Map集合存储自定义类对象

我自己已经写好了一个Person类,内含String name,int age,类里各种getter setter方法都写了,还重写了toString()以及hashCode()和equals()方法;
1.value是类

private static void show01() {
    HashMap<String, Person> map = new HashMap<>();
    map.put("北京",new Person("张三",18));
    map.put("广州",new Person("张四",19));
    map.put("上海",new Person("张五",20));
    map.put("北京",new Person("张六",18));
    Set<String> set = map.keySet();//keyset遍历集合
    for(String key:set){
        Person value=map.get(key);
        System.out.println(value);
    }
}
//运行结果
Person{name='张四', age=19}
Person{name='张五', age=20}
Person{name='张六', age=18}

2.key是类

private static void show02() {
    HashMap<Person, String> map = new HashMap<>();
    map.put(new Person("C罗",18),"葡萄牙");
    map.put(new Person("梅西",19),"阿根廷");
    map.put(new Person("C罗",18),"中国");//如果没重写hashcode和equals,则打印出来三个
    Set<Map.Entry<Person, String>> set = map.entrySet();
    for(Map.Entry<Person,String> entry:set){
        Person key=entry.getKey();
        String value = entry.getValue();
        System.out.println(key+value);
    }
   }
   //运行结果
   Person{name='梅西', age=19}阿根廷
   Person{name='C罗', age=18}中国

练习:输入一个字符串,求每个字符出现的次数

public class Test {
    public static void main(String[] args) {
        //1.提示输入一个字符串
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        //2.创建map集合,key存储字符串中的字符,value是出现个数
        HashMap<Character,Integer> map = new HashMap<>();
        //3.遍历字符串,获取每一个字符
        for(char c:s.toCharArray()){
            //4.判断Map集合中是否存在这个字符
            if(map.containsKey(c)){
                Integer value = map.get(c);
                value++;
                map.put(c,value);
            }else{
                map.put(c,1);
            }
        }
        //5.遍历输出
        for(Character key:map.keySet()){
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!