您的位置:首页 > 其它

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

2016-09-18 21:42 357 查看
这几天用到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键。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TreeMap