Map集合、JDK9对集合新特性

Map集合

Map集合概述

Map接口与Collection接口的区别

Collection接口:定义了单列集合规范,每次存储一个元素 单个元素
单身集合:Collection
Map接口:定义了双列集合规范,每次存储一对元素
夫妻对集合:Map<key,value>
通过键可以找到对应的值
1、键唯一(值可以重复)
2、键和值—映射
一个键对应一个值
3、靠键维护他们的关系

Map常用子类

通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。

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

tips:Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数
据类型可以相同,也可以不同。

Map接口中的常用方法

public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

tips:
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到
集合中;
若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的
值,替换成指定的新值。

Map集合遍历方式

Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值
实现步骤:
1、使用Map集合中的方法keySet(),把map中所有的key取出来,存储到一个Set集合中
2、遍历Set集合,获取Map集合中的每一个key
3、通过Map集合中的方法get(key),通过key找到value

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapSetDemo01 {
    public static void main(String[] args) {
        //创建Map集合对象
        HashMap<String,String> hm = new HashMap<>();
        hm.put("林心如","霍建华");
        hm.put("梁朝伟","刘嘉玲");
        hm.put("谢娜","张杰");
        //1、使用Map中的keySet方法,把Map集合所有的key取出来,存储到一个set集合中
        Set<String> set =hm.keySet();
        //2、遍历Set集合,获取Map集合的每一个key
           //使用迭代器遍历Set集合
        Iterator it = set.iterator();
        while(it.hasNext()){
            String key = (String) it.next();
            String value =hm.get(key);
            System.out.println(key+"="+value);
        }
           //使用增强For遍历Set
        for (String map:hm.keySet()){
            //3、通过Map集合中的get(key),通过key找到value
            String value = hm.get(map);
            System.out.println(map+"="+value);
        }

    }
}

Map集合遍历键值对方式

Entry键值对对象

我们已经知道, Map 中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map 中是一一对应关
系,这一对对象又称做Map 中的一个Entry(项) 。Entry 将键值对的对应关系封装成了对象。即键值对对象,这
样我们在遍历Map 集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey() :获取Entry对象中的键。
public V getValue() :获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

键值对方式

键值对方式:即通过集合中的每个键值对( Entry )对象,获取键值对( Entry )对象中的键与值
实现步骤:
1、使用Map集合中的方法entrySet(),把Map集合中多个Entry对象去出来,存到一个个Set集合中
2、遍历得到每一个Entry对象
3、使用Entry对象中的getKey() 和getValue()获取键和值

import java.util.*;

//Map遍历集合的第二种方式
public class MapEntrySetTest {
    public static void main(String[] args) {
        //创建Map集合对象
        HashMap<String,Integer> map =new HashMap<>();
        map.put("迪丽热巴",18);
        map.put("赵丽颖",19);
        map.put("范冰冰",20);
        map.put("陈数",30);
        //1、使用Map集合中的方法entrySet(),把map集合中多个entry对象取出来,存到一个一个Set集合中
        Set<Map.Entry<String,Integer>> set= map.entrySet();
        //2、遍历得到每一个Entry对象
           //使用迭代器遍历每一个Entry对象
        Iterator it = set.iterator();
        while (it.hasNext()){
            Map.Entry<String,Integer> entry = (Map.Entry<String, Integer>) it.next();
            //3、使用Entry对象中的方法getKey()和getvalue()获取键和值
            String key =entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
           //使用增强for遍历每一个Entry对象
         for (Map.Entry<String,Integer> entry:set){
             String key =entry.getKey();
             Integer value = entry.getValue();
             System.out.println(key+"="+value);
         }
    }
}

HashMap存储自定义类型键值

package HashSetTest;

import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
    public static void main(String[] args) {
        //1、创建HashMap集合对象
        Map<Student, String> map = new HashMap ();
        //2、添加元素
        map.put(new Student("Alice",19),"上海");
        map.put(new Student("Jan",29),"北京");
        map.put(new Student("Shelly",39),"天津");
        map.put(new Student("Allen",18),"广州");

        //3、取出元素,键找值方式
        for (Student keys:map.keySet()){
            String value = map.get(keys);
            System.out.println(keys+":"+value);
        }
    }
}

  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的
    hashCode和equals方法
  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap 集合来存放。

LinkedHashMap

我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保
证有序,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();

Map集合练习

import java.util.HashMap;
import java.util.Scanner;

public class MapExerciseTest {
   /* 需求:计算一个字符串中每个字符出现的次数
   分析:
   1、获取一个字符串对象
   2、创建一个Map集合,键代表字符,值代表次数
   3、遍历字符串得到每个字符
   4、判断Map中是否有该键
   5、如果没有 第一次出现,存储次数为1;如果有则说明出现过,获取对应的值进行++,再次存储
   6、打印最终结果
    */
    public static void main(String[] args) {
        //1、使用Scanner获取用户输入的字符串
        System.out.println("请录入一个字符串:");
        Scanner scan = new Scanner(System.in);
        String line = scan.next();
        findChar(line);

    }

    private static void findChar(String line) {
        //1、创建一个集合,存储字符以及出现的次数
        HashMap<Character, Integer> map= new HashMap();
        //2、遍历字符串,获取每一个字符
        for (int i = 0; i < line.length(); i++) {
            char c =line.charAt(i);
            //使用获取的字符,取mao集合判断key是否存在
            if (map.containsKey(c)){
                //key存在
                Integer value = map.get(c);
                value++;
                map.put(c,value);//再次存入 更新
            }else{
                //key没出现过,那就是第一次
                map.put(c ,1);
            }

        }
        System.out.println(map);

    }
}

JDK9对集合新特性

List,Set,Map接口:里面增加类一个静态的方法of,可以给集合一次性添加多个元素
static List of(E…element)
使用前提:
当集合中存储元素的个数已经确定类,不再改变时使用
注意:
1、of方法只适用于List,Set,Map接口,不适用与其接口的实现类
2、of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
3、Set接口和Ma接口在调用of方法的时候,不能有重复的元素,否则会抛出异常

import java.util.List;
import java.util.Set;

public class MapTest {
    public static void main(String[] args) {
        List<String> list =List.of("a","x","c","d");
        list.add("s");//b报UnsupportedException:不支持操作异常
    }
}

Debug调试程序

可以让代码逐行执行,查看代码执行过程,调试程序中出现的bug
执行程序:
f8:逐行执行程序
f7:进入方法体
shift+f8:跳出方法
f9:跳到下一个断点,如果没有下一个断点就结束程序
ctrl+f2:退出debug模式,停止程序
console:切换到控制台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值