你真的用对了Map吗.md

本文通过几个简单的示例探讨了在 Java 中使用 Map 类型时可能遇到的问题,特别是针对 HashMap 的 get() 方法在处理未定义键时的行为。文章还介绍了如何避免 NullPointerException 的方法,并推荐了 map.getOrDefault() 的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map我们经常使用,但是你真的会用吗?

这篇文章,我不是为了说明Map的实现原理是什么,我就是为了记录一个开发中遇到的问题,以及如何解决.

先来写一个简单的小demo:

public class TestMap {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        System.out.println("args = [" + map.toString() + "]");
    }
}

运行结果我就不截图了

args = [{111=111, 222=222, 333=333}]

Process finished with exit code 0

就是这样的,没有什么特殊的,下面我们在来看一个demo:

public class TestMap {
    public static void main(String[] args) {
        System.out.println("args = [" + getInteger("111") + "]");
    }

    public static int getInteger(String key){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        return map.get(key);
    }
}

运行结果为:

args = [111]

Process finished with exit code 0

也没有什么问题,但是刚我们调用getInteger(String key)
的时候传入的参数在Map里面没有呢?
看下面这个demo:

public class TestMap {
    public static void main(String[] args) {
        System.out.println("args = [" + getInteger("444") + "]");
    }

    public static int getInteger(String key){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        return map.get(key);
    }
}

运行结果:

Exception in thread "main" java.lang.NullPointerException
    at TestMap.getInteger(TestMap.java:15)
    at TestMap.main(TestMap.java:6)

Process finished with exit code 1

这时候会报一个空指针异常,为什么会有空指针异常呢?
这里涉及到一个JDK1.5之后的自动装箱拆箱机制.
原因大概可以这么说,看一段代码

    public static void main(String[] args) {
        Integer integer = 99;
        int i = integer;
        System.out.println(i);
    }

结果为:

99

Process finished with exit code 0

但是当代码改为这样:

public static void main(String[] args) {
    Integer integer = null;
    int i = integer;
    System.out.println(i);
}

结果为:

Exception in thread "main" java.lang.NullPointerException
    at TestMap.main(TestMap.java:7)

Process finished with exit code 1

其实就是拆箱失败,所以在Map使用的时候,返回值为基本数据类型的情况下,最后不要直接get().
下面给出一段提倡的使用方法:

public class TestMap {
    public static void main(String[] args) {
        /*Integer integer = null;
        int i = integer;
        System.out.println(i);*/

        System.out.println("args = [" + getInteger("444",-1) + "]");
    }

    public static int getInteger(String key,int defaultt){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);
        if (map.containsKey(key)){
            return map.get(key);
        }

        return defaultt;
    }
}

返回结果:

args = [-1]

Process finished with exit code 0

这样就当key不存在的时候就不会报空指针异常了.

在JDK1.8中已经有这样的方法了:

map.getOrDefault(key,defaultt);
看一下源码:
    default V getOrDefault(Object key, V defaultValue) {
        V v;
        return (((v = get(key)) != null) || containsKey(key))
            ? v
            : defaultValue;
    }

实现原理差不多,此方法在JDK1.8中才有.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值