通常。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. UVA 10795 - A Different Task(递归)

     A Different Task  The (Three peg) Tower of Hanoi problem is a popular one in computer science. Brie ...

  2. .NET Core R2

    .NET Core R2安装及示例教程   前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core.由于各种原因,就没有初试.刚好,前 ...

  3. php网站共享session方法(相同一级域名)

    这段时间做web开发使用的是php语言 要实现从主站进入子站时无需再登录(如已登录) 使用memcache实现 方法如下 修改php.ini如下 添加 extension=php_memcache.d ...

  4. DataSnap起源于MIDAS(十几篇博客)

    作为MIDAS起始于Delphi3,Delphi4是MIDAS II,Delphi5中是MIDASIII,而后基于COM远程数据模块方式使用TCP/IP,HTTP,(D)COM构建出强大的通讯能力.从 ...

  5. [置顶] Cocos2d-x 实例源码分析之二 小实例的主框架

    这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说, ...

  6. 得到一个临时的文件名称(使用GetTempFileName API函数)

    function GetExePath: string; begin Result := ExtractFilePath(ParamStr()); end; function GetTempFileN ...

  7. [Xcode]some little skill

    Date:2014-1-2 Summary: 自己在使用Xcode的一些小习惯,记录下来,我是这么用的,你呢? Contents:1.使用#warning 在工作中,难免需要做一些test,但是又怕忘 ...

  8. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  9. latex表格线的颜色设置(边框添加颜色)

    添加了如下包:边框颜色要用到booktabs, colortbl, 包,下面代码里有一个自定义的颜色tabcolor \usepackage{ctexcap} \usepackage{graphicx ...

  10. JAVA线程相互排斥问题

    public class TraditionalThreadSynchonized { public static void main(String[] args) { final OutPuter ...