Map集合详解

Map集合

Map集合特点

  • Map集合是一个双列集合,一个元素包括两个值(一个key,一个value)
  • Map集合中的元素,key和value数据类型可以相同,也可以不同
  • Map集合中的元素,key是不可以重复的,value可以
  • Map集合中的元素,key和value一一对应

Map常用的子类

  • HashMap<k,v>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致
  • LinkedHashMap<k,v> : HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Map接口常用的方法

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
  • boolean containsKey(Object key) 判断集合中是否包含指定的键。

Map接口的方法演示

public class Deom01 {
    public static void main(String[] args) {
        show03();
    }

    private static void show03() {
        /*
        ``boolean containsKey(Object key)  ` 判断集合中是否包含指定的键。
         */

        Map<String,Integer> map = new HashMap<>();
        map.put("小夫",170);
        map.put("小刘",175);
        map.put("小王",183);

        boolean b1 = map.containsKey("小王");
        System.out.println(b1);//true

        boolean b2 = map.containsKey("小贾");
        System.out.println(b2);//false

    }

    private static void show02() {
        /*`public V remove(Object key)`: 把
        指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

        返回值:v
            key存在返回被删除的值
            不存在 返回null
         */

        //创建map集合
        Map<String,Integer> map = new HashMap<>();
        map.put("小夫",170);
        map.put("小刘",175);
        map.put("小王",183);
        System.out.println(map);//{小刘=175, 小夫=170, 小王=183}

        Integer v1 = map.remove("小夫");
        System.out.println(v1);//170

        System.out.println(map);//{小刘=175, 小王=183}
    }

    /*
            返回值:v
                存储值对的时候,key不重复,返回值是value
                存储之对的时候,会使用新的value
     */
    private static void show01() {
           /*
            返回值:v
                存储值对的时候,key不重复,返回值是value
                存储之对的时候,会使用新的value
     */
        //创建map集合
        Map<String,String>map = new HashMap<>();

        String v1 = map.put("小夫", "胖虎");
        System.out.println("v1:"+v1);//v1:null


        String v2 = map.put("小夫", "胖虎2");
        System.out.println("v2:"+v2);//v2:胖虎

        System.out.println(map);//{小夫=胖虎2}
    }
}

Map集合遍历找值方式

Map集合第一种遍历方式:通过找值的方式

实现步骤:

  • 使用Map集合中的方法keyset(),把Map集合中所有key取出来,存储到一个set集合中
  • 遍历set集合
  • 通过map集合中的方法get(key),通过key找到value
public static void main(String[] args) {
    Map<String,Integer> map = new HashMap<>();
    map.put("小夫",170);
    map.put("小刘",175);
    map.put("小王",183);

    //使用keySet()方法,把Map集合中的key取出来,存储到set集合中
    Set<String> set = map.keySet();

    //2.遍历set集合,获取Map集合中的每一个key
    //使用迭代器遍历Set集合
    Iterator<String> it = set.iterator();
    while (it.hasNext()){
        String key = it.next();

        //3.通过map集合中的方法get(key),通过key找到value
        Integer value = map.get(key);
        System.out.println(key+value); }//小刘175
                                        //小夫170
                                         //小王183


            //使用增强for循环
        for(String key:map.keySet()){
            //3.通过map集合中的方法get(key),通过key找到value
            Integer value = map.get(key);
            System.out.println(key+value); }//小刘175
                                            //小夫170
                                            //小王183






}

Map集合的第二种遍历方式:使用Entry对象

实现步骤:

  • 使用Map集合中的方法entrySet(),把map集合中的多个Entry对象取出来,存到一个set集合
  • 遍历集合,获取每一个Entry对象
  • 使用Entry对象中的方法getkey()和getvalue()获取键与值

代码

{
    public static void main(String[] args) {
        //创建map集合
        Map<String,Integer> map = new HashMap<>();
        map.put("小夫",170);
        map.put("小刘",175);
        map.put("小王",183);

        //1.使用Map集合中的方法entrySet(),把map集合中的多个Entry对象取出来,存到一个set集合
        Set<Map.Entry<String, Integer>> set = map.entrySet();

        //2.遍历集合,获取每一个Entry对象
        Iterator<Map.Entry<String, Integer>> it = set.iterator();
        while (it.hasNext()){
            Map.Entry<String, Integer> entry = it.next();

            //3.使用Entry对象中的方法getkey()和getvalue()获取键与值
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+value);
        }
            for (Map.Entry<String,Integer>entry:set){
                //3.使用Entry对象中的方法getkey()和getvalue()获取键与值
                String key = entry.getKey();
                Integer value = entry.getValue();
                System.out.println(key+value);

            }

    }
}

LinkedHashMap集合

是在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

代码

public class LinkedHashMap {
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("yi","er");
        map.put("san","si");
        map.put("wu","liu");
        map.put("s","s");
        System.out.println(map);//{yi=er, san=si, s=s, wu=liu}  不重复 无序

        java.util.LinkedHashMap<String,String> linked = new java.util.LinkedHashMap<>();
        map.put("yi","er");
        map.put("san","si");
        map.put("wu","liu");
        map.put("s","s");
        System.out.println(map);//{yi=er, san=si, s=s, wu=liu}    不重复  有序
    }
}
java.util.LinkedHashMap<String,String> linked = new java.util.LinkedHashMap<>();
        map.put("yi","er");
        map.put("san","si");
        map.put("wu","liu");
        map.put("s","s");
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for(Map.Entry<String,String> entry : entrySet){
            System.out.println(entry.getKey()+" "+entry.getValue());}
//        yi er
//        san si
//        s s
//        wu liu

Hashtable集合

  • Hashtable底层也是一个哈希表,是一个线程安全的集合,是单线程的集合,速度慢

  • Hashtable集合,不能存储null值,null键

  • Hashtable和Vector集合一样,在jdk1.2之后被更先进的集合(Hashmap,ArrayList)取代了

  • Hashtable的子类Properties依然活跃在历史舞台

  • Properties集合是唯一一个和IO流结合的集合

Map集合练习

**需求:**计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象
  2. 创建一个Map集合,键代表字符,值代表次数。
  3. 遍历字符串得到每个字符。
  4. 判断Map中是否有该键。
  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。
  6. 打印最终结果

代码

public class MapTest {
    public static void main(String[] args) {
       //输入字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        //创建Map集合,key是字符串的字符,value是字符的个数
        HashMap<Character,Integer> map = new HashMap<>();
        //遍历字符串,获取字符
        for (char c :str.toCharArray()){
            //shi用获取到的字符,去Map集合判断是否存在
            if(map.containsKey(c)){
                //key存在
                Integer value = map.get(c);
                value++;
                map.put(c,value);

            }else {
                //key不存在
                map.put(c,1);
            }

            }
        //遍历Map集合,输出结果
        for ( Character key :map.keySet()){
            Integer value = map.get(key);
            System.out.println(key+"= "+value);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值