Treemap有关null的键值,null的key


问题描述:我们都知道 HashMap是可以存储null值null键的。那么TreeMap可以么? 
首先我们看是否可以存储null值,代码如下:

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

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

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

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);

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在TreeMap中传入比较器,put方法优先调用比较器,因而在s1 == null时强制其返回1,即可实现存储null键。但这时并不能使用get(键)的方法去获取值
仅能通过如下方式去遍历获取键值对

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值