Java集合源码剖析(三)

本文详细介绍了Java中的TreeMap数据结构,包括构造方法、插入(put)操作、删除(deleteEntry)操作。TreeMap是基于红黑树实现的有序Map,插入操作遵循二叉排序树规则并进行调整,删除操作同样需要维护红黑树性质。文章还对比了TreeMap与HashMap的性能和使用场景,并提到TreeMap的key不能为null。最后,简要提到了LinkedHashMap,它是HashMap的子类,通过双向链表保持插入顺序或访问顺序。
摘要由CSDN通过智能技术生成

很明显它是将Map中的元素一个个put(插入)到TreeMap中的,主要因为Map中的元素是无序存放的,因此要一个个插入到红黑树中,使其有序存放,并满足红黑树的性质。

4、带有SortedMap的构造方法

[java]  [view plain](() [copy](()

  1. public TreeMap(SortedMap<K, ? extends V> m) {

  2. comparator = m.comparator();

  3. try {

  4. buildFromSorted(m.size(), m.entrySet().iterator(), null, null);

  5. } catch (java.io.IOException cannotHappen) {

  6. } catch (ClassNotFoundException cannotHappen) {

  7. }

  8. }

首先将比较器指定为m的比较器,这取决于生成m时调用构造方法是否传入了指定的构造器,而后调用buildFromSorted方法,将SortedMap中的元素插入到TreeMap中,由于SortedMap中的元素师有序的,实际上它是根据SortedMap创建的TreeMap,将SortedMap中对应的元素添加到TreeMap中。

[](()    插入删除


插入操作即对应TreeMap的put方法,put操作实际上只需按照二叉排序树的插入步骤来操作即可,插入到指定位置后,再做调整,使其保持红黑树的特性。put源码的实现:

[java]  [view plain](() [copy](()

  1. public V put(K key, V value) {

  2. Entry<K,V> t = root;

  3. // 若红黑树为空,则插入根节点

  4. if (t == null) {

  5. // TBD:

  6. // 5045147: (coll) Adding null to an empty TreeSet should

  7. // throw NullPointerException

  8. //

  9. // compare(key, key); // type check

  10. root = new Entry<K,V>(key, value, null);

  11. size = 1;

  12. modCount++;

  13. return null;

  14. }

  15. int cmp;

  16. Entry<K,V> parent;

  17. // split comparator and comparable paths

  18. Comparator<? super K> cpr = comparator;

  19. // 找出(key, value)在二叉排序树中的插入位置。

  20. // 红黑树是以key来进行排序的,所以这里以key来进行查找。

  21. if (cpr != null) {

  22. do {

  23. parent = t;

  24. cmp = cpr.compare(key, t.key);

  25. if (cmp < 0)

  26. t = t.left;

  27. else if (cmp > 0)

  28. t = t.right;

  29. else

  30. return t.setValue(value);

  31. } while (t != null);

  32. }

  33. else {

  34. if (key == null)

  35. throw new NullPointerException();

  36. Comparable<? super K> k = (Comparable<? super K>) key;

  37. do {

  38. parent = t;

  39. cmp = k.compareTo(t.key);

  40. if (cmp < 0)

  41. t = t.left;

  42. else if (cmp > 0)

  43. t = t.right;

  44. else

  45. return t.setValue(value);

  46. } while (t != null);

  47. }   《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】

  48. // 为(key-value)新建节点

  49. Entry<K,V> e = new Entry<K,V>(key, value, parent);

  50. if (cmp < 0)

  51. parent.left = e;

  52. else

  53. parent.right = e;

  54. // 插入新的节点后,调用fixAfterInsertion调整红黑树。

  55. fixAfterInsertion(e);

  56. size++;

  57. modCount++;

  58. return null;

  59. }

这里的fixAfterInsertion便是节点插入后对树进行调整的方法,这里不做介绍。

删除操作及对应TreeMap的deleteEntry方法,deleteEntry方法同样也只需按照二叉排序树的操作步骤实现即可,删除指定节点后,再对树进行调整即可。deleteEntry方法的实现源码如下:

[java]  [view plain](() [copy](()

  1. // 删除“红黑树的节点p”

  2. private void deleteEntry(Entry<K,V> p) {

  3. modCount++;

  4. size–;

  5. if (p.left != null && p.right != null) {

  6. Entry<K,V> s = succes

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值