Java 集合(三)Map

Map 是一种键值映射表,可以通过 key 快速查找对应的 value。

创建 Map

package com.chen.scanner;

import java.util.*;

public class TestMap {
    public static void main(String[] args) {
        Student s = new Student("Xiao Ming",99);
        Map<String,Student> map = new HashMap<>();

        map.put("Xiao Ming",s); //将 xiaoming 和 student 实例映射并关联
        Student target = map.get("Xiao Ming");

        System.out.println(target == s); //同一个实例
        System.out.println(target.score);

        Student another = map.get("Bob");
        System.out.println(another); //未找到,返回 null

        boolean isHave = map.containsKey("Bob");
        System.out.println(isHave);

    }
}

class Student {
    public String name;
    public int score;

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

如果想查找某个 key 是否存在,可以调用 boolean containsKey(K key)方法。

注意:Map 中不存在重复的 key,对应的 value 可以重复。

遍历 Map

package com.chen.scanner;

import java.util.*;

public class TestMap {
    public static void main(String[] args) {
        Student xiaoming = new Student("Xiao Ming",99);
        Student xiaoli = new Student("Xiao Li",100);
        Map<String,Student> map = new HashMap<>();

        map.put("xiao ming",xiaoming);
        map.put("xiaoli",xiaoli);
        
        //遍历 Map
        for (String key: map.keySet()) {
            int score = map.get(key).score;
            System.out.println(key + " = " + score);
        }

    }
}

class Student {
    public String name;
    public int score;

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

注意:遍历 Map 时,不可假设输出的 key 是有序的!

正确使用 Map 必须保证:

  1. 作为 key 的对象必须正确重写 equals()方法,相等的两个 key 实例调用 equals() 必须返回 true。
  2. 作为 key 的对象还必须重写 hashCode()方法,且 hashCode()方法要严格遵循以下规范:
    a. 如果两个对象相等,则两个对象的 hashCode()必须相等。
    b. 如果两个对象不相等,则两个对象的 hashCode()尽量不要相等。

hashCode()方法编写的越好,HashMap工作的效率就越高。

使用 EnumMap

Map<DayOfWeek,String> map = new EnumMap<>(DayOfWeek.class);
map.put(DayOfWeek.MONDAY,"星期一");
map.put(DayOfWeek.TUESDAY,"星期二");
map.put(DayOfWeek.WEDNESDAY,"星期三");
map.put(DayOfWeek.THURSDAY,"星期四");
map.put(DayOfWeek.FRIDAY,"星期五");
map.put(DayOfWeek.SATURDAY,"星期六");
map.put(DayOfWeek.SUNDAY,"星期天");

System.out.println(map);
System.out.println(map.get(DayOfWeek.MONDAY));

使用 TreeMap

我们已经知道,HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的 key 是无序的,即遍历 HashMap的 key 时,其顺序是不可预测的。
SortedMap是接口,内部会对 key 进行排序,它的实现类是 TreeMap。

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("orange", 1);
        map.put("apple", 2);
        map.put("pear", 3);
        for (String key : map.keySet()) {
            System.out.println(key);
        }
        // apple, orange, pear
    }
}

注意:使用 TreeMap 时,放入的 key 必须实现 Comparable接口。String,Integer这些类已经实现了该接口,因此可以直接作为 key 使用。作为 value 的对象则没有任何要求。

参考文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值