java详解 --- Map接口

一.接口
Map接口中键和值一一映射. 可以通过键来获取值。
Map的结构:Map(key,value)(这里是一对<>) map = new Map<>();
key称为键值,value称为键对应值.
1.特点:
①.数据的保存是以键值对形式存储的(一个key对应一个value值 – 映射关系);
②.键是唯一的,不能重复的.

2.HashSet 和 HashMap 之间的关系
HashSet 底层的实现其实就是 HashMap,就是说HashSet依赖于HashMap,在HashSet添加值就是在HashMap中的key添加值.而去除重复和排序是对HashMap中的key进行操作的.
所以说,HashSet和HashMap的去重和排序都要重写HashCode()方法和equals()方法.

3.代码举例:
①.在map中保存4对键对值 姓名 年龄

HashMap<String, Integer> map = new HashMap<>();
map.put("张三", 18);
map.put("李四", 19);
map.put("王二", 20);
map.put("麻子", 21);
// 键值还有一个,输出value数覆盖后的值
map.put("麻子", 22);
System.out.println(map);

输出结果:

{李四=19, 张三=18, 麻子=22, 王二=20}

②.测试map的各种方法

        HashMap<String, Integer> map = new HashMap<>();
        map.put("张三", 18);
        map.put("李四", 19);
        map.put("王二", 20);
        map.put("麻子", 21);

        // 测试containsKey(Object key)
        // 测试是否包含key值
        boolean containsKey = map.containsKey("李四");
        System.out.println("1." + containsKey);

        // 测试containsValue(Object Value)
        // 测试是否包含value值
        boolean containsValue = map.containsValue(20);
        System.out.println("2." + containsValue);

        // 测试isEmpty()
        // 测试map集合是否是空的
        boolean empty = map.isEmpty();
        System.out.println("3." + empty);

        // 测试size()
        // 测试map集合的长度
        int size = map.size();
        System.out.println("4." + size);

        // 测试remove(Object key)
        // 测试删除对应的键值
        map.remove("李四");
        System.out.println("5." + map);

        // 测试clear()
        // 测试清空map集合
        map.clear();
        System.out.println("6." + map);

输出结果:

1.true
2.true
3.false
4.4
5.{张三=18, 麻子=21, 王二=20}
6.{

}

③.创建Map
key保留学生 value保存学生的户籍
先写一个学生类:

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {

    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public int compareTo(Student o) {
        int num = this.age - o.age;
        return num == 0 ? 1 : num;
    }

}

写main函数部分

        HashMap<Student, String> map = new HashMap<>();
        map.put(new Student("张三", 18), "北京");
        map.put(new Student("李四", 19), "上海");
        map.put(new Student("王二", 20), "广州");
        // 键不会重复保存 但是 会覆盖上一个值
        map.put(new Student("王二", 20), "南京");
        System.out.println(map);

输出结果:

{Student [name=王二, age=20]=南京, Student [name=张三, age=18]=北京, Student[name=李四, age=19]=上海}

二.Map的三种遍历方式

1.迭代器遍历

        HashMap<String, Integer> map = new HashMap<>();
        map.put("s1",15);
        map.put("s2",16);
        map.put("s3",17);
        map.put("s4",18);
        // 取出map中的键值的set集合
        Set<String> set = map.keySet();
        // 取出set中的迭代器
        Iterator<String> iterator = set.iterator();
        // 为拿到所有key遍历set集合
        while (iterator.hasNext()) {
            // 获取集合中的所有key值
            String key = iterator.next();
            // 根据key值取出对应的Value值
            Integer value = map.get(key);
            System.out.println(key + " = " + value);
        }

输出结果:

s3 = 17
s4 = 18
s1 = 15
s2 = 16

2.增强for循环遍历

        HashMap<String, Integer> map = new HashMap<>();
        map.put("s1",15);
        map.put("s2",16);
        map.put("s3",17);
        map.put("s4",18);
        // 取出map中的key的所有set集合
        Set<String> set = map.keySet();
        for (String key : set) {
            Integer value = map.get(key);
            System.out.println(key + " = " + value);
        }

输出结果:

s3 = 17
s4 = 18
s1 = 15
s2 = 16

3.entrySet方法

        HashMap<String, Integer> map = new HashMap<>();
        map.put("s1",15);
        map.put("s2",16);
        map.put("s3",17);
        map.put("s4",18);
        // 取出map中的所有的entrySet()
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        // 取出迭代器
        Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            // 取出所有的entry对象 与键值对应
            Entry<String, Integer> entry = iterator.next();
            // 从entry中取出key 和 value
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " = " + value);
        }

输出结果:

s3 = 17
s4 = 18
s1 = 15
s2 = 16

④.利用entry()方法 增强for循环遍历

        HashMap<String, Integer> map = new HashMap<>();
        map.put("s1",15);
        map.put("s2",16);
        map.put("s3",17);
        map.put("s4",18);
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        for (Entry<String, Integer> entry : entrySet) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " = " + value);
        }

输出结果:

s3 = 17
s4 = 18
s1 = 15
s2 = 16

⑤.LinkedHashMap
特点:怎么存怎么取

        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        map.put("s1",15);
        map.put("s2",16);
        map.put("s3",17);
        map.put("s4",18);
        System.out.println(map);

输出结果:
{s1=15, s2=16, s3=17, s4=18}

⑥.TreeMap 可以对map中的键进行排序
向TreeMap中添加3个学生 key是学生 value是户籍
并按年龄排序.

学生类可以看一,3,③中的学生类
实现了comparable的方法并重写了compareTo方法

        TreeMap<Student,String> map = new TreeMap<>();
        map.put(new Student("s1", 18), "北京");
        map.put(new Student("s2", 19), "上海");
        map.put(new Student("s3", 20), "广州");
        System.out.println(map);

输出结果:

{Student [name=s1, age=18]=北京, Student [name=s2, age=19]=上海,Student[name=s3, age=20]=广州}

三.Map的嵌套

简单理解就是Map里面套了一个Map
代码举例:
java学科有两个班:
java1班 – 学生 和 户籍
java2班 – 学号 和 户籍

        // 创建1班
        HashMap<Student, String> c1 = new HashMap<>();
        c1.put(new Student("张三", 18), "北京");
        c1.put(new Student("李四", 19), "上海");
        // 创建2班
        HashMap<Student, String> c2 = new HashMap<>();
        c2.put(new Student("王二", 20), "广州");
        c2.put(new Student("麻子", 21), "南京");
        // 创建java学科
        HashMap<HashMap<Student, String>, String> java = new HashMap<>();
        java.put(c1, "1班");
        java.put(c2, "2班");
        // 遍历java学科
        for (HashMap<Student, String> c : java.keySet()) {
            // java中对应的value -- 对应的班级
            String ban = java.get(c);
            System.out.println(ban);
            for (Student student : c.keySet()) {
                // c中对应的value -- 对应的户籍
                String HJ= c.get(student);
                System.out.println(student + " -- " + HJ);
            }
        }

输出结果:

1班
Student [name=张三, age=18] – 北京
Student [name=李四, age=19] – 上海
2班
Student [name=王二, age=20] – 广州
Student [name=麻子, age=21] – 南京

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值