通常。Tree是Tree,List是List,两者不太可能混在一起。但apache-commons库却用tree实现了实现了List的接口,也就是TreeList类。与标准的LinkedList相比。TreeList略微浪费一点空间,但经常使用操作的时间复杂度均减少到了O(log N),值得在开发中权衡利弊、合理应用。

内部数据结构

TreeList内部包括了一个Thread AVL Tree。AVL Tree非经常见了,是一种典型的Balanced Binary Tree,但以下简介下Thread Binary Tree。

Thread Binary Tree对Binary Tree添加了下面特性:(1)假设一个节点X没有左子树。则把本来应指向左子树的指针,指向中序遍历的前节点。(2)假设一个节点X没有右子树,则把本来应指向右子树的指针,指向中序遍历的后节点。

下图就是一个Thread Binary Tree,以节点5为例:(1)
节点5没有左子树,但节点5的中序遍历的前节点是4;(2)
节点5没有右子树,但节点5的中序遍历的后节点是6。

这两个特性提高了二叉树依序訪问的速度。

下面是TreeList中AVL树节点的定义

    static class AVLNode<E> {
/** 左子树或者中序遍历的前节点.*/
private AVLNode<E> left;
/** true表示left字段是左子树;false表示left字段是中序遍历的前节点 */
private boolean leftIsPrevious;
/** 右子树或者中序遍历的后节点 */
private AVLNode<E> right;
/** true表示right字段是右子树;false表示right字段是中序遍历的后节点 */
private boolean rightIsNext;
/** How many levels of left/right are below this one. */
private int height;
/** 在List中的索引相对于父节点索引的偏移量。根节点就是根节点的索引*/
private int relativePosition;
/** 节点所保存的有效荷载 */
private E value;
}

在逻辑上。TreeList中的节点是依据节点在List中的索引来比較大小的。在实现上,AVLNode类保存的是当前节点的索引相对于父节点的偏移量,也就是relativePosition这个字段。这样做的长处是,当向List中间插入一个节点时。插入点之后的全部节点的索引值都变大了,但由于AVLNode保存的是相对值。因此仅仅须要改动特定子树的根节点的relativePosition值,整个子树全部节点的索引值都会发生变化。

时空复杂度

TreeList既然是用AVL树实现,则其在特定位置进行插入、删除和get操作的时间复杂度都是O(log N),另外还要加上较大的时间常量。

LinkedList是採用双向链表实现的。其在特定位置进行插入、删除和get操作的时间复杂度都是O(N)。

空间复杂度

首先看一下LinkedList中每一个节点的定义:

private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
}

依据以上定义。在32位Hostspot虚拟机下,每一个Entry对象占用6*4=24个byte(这包含8个byte的对象头、12个byte的真实字段和4个byte的对齐填充)。

依据AVLNode的定义,每一个AVLNode节点占用8*4=32个byte(包含8个byte的对象头、22个byte的真实字段和2个byte的对齐填充)。

因此,TreeList的每一个节点比LinkedLists多占领8个byte。

Java集合类汇总记录-- apache.commons4(TreeList)的更多相关文章

  1. Java集合类汇总记录--JDK篇

    接口类图 Java Collection由两套并行的接口组成,一套是Collection接口,一套是Map接口.例如以下图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  2. Java集合类汇总记录--guava篇

    BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现).分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方 ...

  3. JAVA集合类汇总

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  4. JAVA集合类汇总 - 转载

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  5. Java集合类学习记录

    被标记为transient的属性在对象被序列化的时候不会被保存int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, new_le ...

  6. spring异常记录-----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

    今天在练习怎样SSH中进行单元測试的时候出现下列异常: SEVERE: Exception starting filter Struts2 java.lang.NoClassDefFoundError ...

  7. java 集合类基础问题汇总

     1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...

  8. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  9. java集合类(五)About Map

    接上篇“java集合类(四)About Set” 这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android ...

随机推荐

  1. NYOJ 1085 数单词 (AC自己主动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 为了可以顺利通过英语四六级考试,如今大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中能够通过六 ...

  2. Android:自定义滚动边缘(EdgeEffect)效果

    Android可滚动控件(GridView.ListView.ScrollView等)当用户滚动到头的时候会有个边缘反馈效果,在4.0上默认为Holo蓝色效果.  如果您的App自定义了主题颜色,比如 ...

  3. web前端优化手段

    web前端优化手段有很多,同种的优化方式或许在不同的网络协议会南辕北辙,下面就自己结合工作经验和学习总结的一些手段总结 1.合并文件减小请求数:sprite图片的合成.合并脚本与样式. 2.减小文件的 ...

  4. 【Demo 0004】屏幕、窗体及视图基础知识

    本章学习要点       1.  了解iOS中应用程序(UIApplication)与屏幕.窗体以及视图相关基础知识:       2.  掌握应用程序常用的属性与方法:        3.  掌握窗 ...

  5. J2EE开发框架搭建(2) - springmvc4 + spring4 + hibernate4 整合

    1. 打开hqhop-framework-parent项目下的pom.xml文件.加入springmvc4 , spring4 , hibernate4 ,以及数据源druid的依赖包,插件,依赖包版 ...

  6. Lisp的永恒之道 好文

    http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html

  7. MFC TCHAR 和CHAR相互转换

    没有定义UNICODE,所以它里面的字符串就是简单用" "就行了,创建工程的时候包含了UNICODE定义,就必须对TCHAR和char进行转换. 首先是把TCHAR转为char / ...

  8. KMP(Knuth-Morris-Pratt)算法

    一.朴素匹配算法 也就是暴力匹配算法.设匹配字符串的长度为n,模式串的长度为m,在最坏情况下,朴字符串匹配算法执行时间为O((n - m + 1)m). 假设m = n / 2, 那么该算法的复杂度就 ...

  9. 指尖上的电商---(12)SolrAdmin中加入多核的还有一种方法

    这一节中我们演示下solr中创建多核的还有一种方法. 接第10讲,首先关闭tomcatserver 1.解压solr-4.8.0后,找到solr-4.8.0以下的example目录下的multicor ...

  10. RegisterHotKey注册热键,然后响应WM_HOTKEY消息

    MSDN中的一个示例代码,步骤就是RegisterHotKey注册热键,然后响应WM_HOTKEY消息 @1:这个是系统热键 #include "stdafx.h" int _cd ...