关于TreeMap集合存取null键null值问题详解

这几天用到TreeMap集合 ,发现好多基础知识都忘的差不多了,写下来备用。
问题描述:我们都知道 HashMap是可以存储null值null键的。那么TreeMap可以么?
首先我们看是否可以存储null值,代码如下:

        TreeMap<String, Integer> ts = new TreeMap<>();
        ts.put("一", 1);
        ts.put("三", null);
        System.out.println(ts.get("三"));

这样运行结果是没有问题的。可以正常输出null
那么null键呢?修改代码如此下:

        TreeMap<String, Integer> ts = new TreeMap<>();
        ts.put("一", 1);
        ts.put("二", 2);
        ts.put(null, 3);
        System.out.println(ts.get(null));

Exception in thread “main” java.lang.NullPointerException
这样的话 ts.put(null, 3); 这一行程序报了空指针异常。
首先明确String类是实现了Comparable接口的。因此TreeMap无需我们传入比较器。这里报了空指针是因为存入数据的时候,put方法调用了String类的compareTo方法,而这时候,其为null,调用其compareTo方法会发生空指针异常
那么,在明白了put方法底层之后,我们可以传入比较器,以实现强制其存储null键。代码如下:

        TreeMap<String, Integer> ts = new TreeMap<>(new Comparator<String>() {
            public int compare(String s1, String s2) {      // 这里明确s1是要拿进来存的数据 s2是已经存进来的数据
                if (s1 == null){
                    return 1;
                    }
                else {
                    return s2.charAt(0) - s1.charAt(0);
                }
            }
        });
        ts.put("一", 1);
        ts.put("二", 2);
        ts.put(null, 3);

在TreeMap中传入比较器,put方法优先调用比较器,因而在s1 == null时强制其返回1,即可实现存储null键。但这时并不能使用get(键)的方法去获取值,原因参见我的上一篇http://blog.csdn.net/tracybug/article/details/52515580
仅能通过如下方式去遍历获取键值对

        Set<Map.Entry<String, Integer>> s = ts.entrySet();
        for (Map.Entry<String, Integer> entry : s) {
            System.out.println(entry);
        }

输出结果:
二=2
一=1
null=3
以上实现强制存储null键。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值