treeMap-get返回null,因为比较器出问题

treeMap-get返回null,因为比较器出问题

以上会get到null值,究其原因,可以从get方法源码中找到答案。TreeMap集合中实现Map集合的get代码如下:

public V get(Object key) {
    Entry<K,V> p = getEntry(key);
    return (p==null ? null : p.value);
}

再继续往下看 getEntry(key)方法:

final Entry<K,V> getEntry(Object key) {
// Offload comparator-based version for sake of performance
if (comparator != null)
return getEntryUsingComparator(key);
//以下代码省略

这个时候就已经很明显了,他用到了我们传入的比较器!!!
接着往下看getEntryUsingComparator(key);

final Entry<K,V> getEntryUsingComparator(Object key) {
@SuppressWarnings(“unchecked”)
K k = (K) key;
Comparator<? super K> cpr = comparator;
if (cpr != null) {
Entry<K,V> p = root;
while (p != null) {
int cmp = cpr.compare(k, p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
}
return null;
}

这个就很明白了,底层在往出取值的时候用到了我们传入的比较器中的compare()方法,TreeMap是二叉树结构存储数据。当我们拿着键去get值时,底层拿着我们传入的键去逐个比对此处调用比较器中的compare方法:小于零则往左边去找,大于零往右去找,只有当等于0时才返回该值,而我们强制compare()方法等于0的时候返回1,所以一直往右边去找,永远找不到,直到最后返回null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreeMapJava中的一种有序映射数据结构,它基于红黑树实现。它可以根据键的自然顺序或自定义比较器对键进行排序,并且键是唯一的。TreeMap提供了一些方法来支持协同进化分析。 1. 插入元素:当向TreeMap中插入一个键值对时,它会根据键的顺序将其插入到正确的位置。如果键已经存在,则会更新对应的值。 2. 删除元素:可以使用remove(key)方法从TreeMap中删除指定的键值对。删除操作会保持树的平衡。 3. 获取元素:可以使用get(key)方法从TreeMap中获取指定键对应的值。如果键不存在,则返回null。 4. 遍历元素:可以使用entrySet()方法获取TreeMap中的所有键值对,并使用迭代器或增强for循环遍历它们。遍历结果是按照键的顺序排列的。 5. 子映射操作:TreeMap提供了一些方法来获取子映射,例如headMap(key)、tailMap(key)和subMap(fromKey, toKey)。这些方法可以返回满足指定条件的键值对子集合。 6. 寻找最小和最大键:可以使用firstKey()和lastKey()方法分别获取TreeMap中的最小和最大键。 7. 寻找前一个和后一个键:可以使用lowerKey(key)和higherKey(key)方法分别获取TreeMap中小于和大于指定键的最接近的键。 8. 比较器:如果没有提供自定义的比较器TreeMap会使用键的自然顺序进行排序。如果提供了自定义的比较器,它将根据比较器的规则进行排序。 9. 性能注意事项:由于TreeMap是基于红黑树实现的,插入和删除操作的时间复杂度为O(log n),其中n是TreeMap中的元素个数。因此,在大量插入和删除操作的场景下,性能可能会受到影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值