Treemap有关null的键值,null的key


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

        TreeMap 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 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


你可能感兴趣的:(java基础,java)