0
点赞
收藏
分享

微信扫一扫

Java的数据结构有那些?

七千22 2022-04-13 阅读 87
java

1.线性表(ArrayList)

一个线性表(Linear List)是由n(n≥0)个数据元素(结点,它可以是一个字母,数字,记录或更复杂的信息)所构成的有限序列。线性表逻辑地表示为:(a0,a1,…,an-1)。其中,n为线性表的长度,n=0时为空表。称iai在线性表中的位序号。

顺序储存结构是用数组来保存数据的, 线性表也就是数组的一种特殊储存方式:从头到尾依次储存数据。

在这里插入图片描述
下面这种情况就不是线性表
在这里插入图片描述
java中以ArrayList为例

数组扩容:ArrayList的底层是Object类的数组,默认长度是10,超过10后,长度变为原长度的1.5倍。
可以简单的认为是一个动态数组;实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数组。

特点:
1 随机访问速度快,插入和移除性能较差(数组的特点);
2 支持null元素的存在;
3 有顺序结构;
4 元素可以重复;
5但线程不安全。
这里说一下什么是线程安全:

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访
问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有
可能出现多个线程先后更改数据造成所得到的数据是脏数据。
List接口下面有两个实现,一个是ArrayList,另外一个是vector。从源码的角度来看,
因为Vector的方法前加了,synchronized 关键字,也就是同步的意思,sun公司希望Vector是线程安全的,
而希望arraylist是高效的,缺点就是另外的优点。

List下面有两个实现类
ArrayList源码注释:
在这里插入图片描述

y

Vector源码注释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上面我们可以看出vector方法上面都用了synchronized来保证方法的同步,所以说他是线程安全的。
而ArrayList在多线程操作的同一个list的情况容易发生数组越界异常。所以在实际应用场景中如果要保证arraylist的线程安全,就需要保证他是一个同步的操作Collections.synchronizedList()。这样他的效率就变低了。


2.链表(LinkedList)

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点(链表中的每一个元素称为节点)组成,节点可以在运行时动态生成。每个节点包含两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。相对于线性表顺序结构,操作复杂。由于不必按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)O(1)。

在这里插入图片描述

链表的优势

  • 不需要知道数据的大小,可以充分利用计算机内存空间,实现灵活的内存动态管理
  • 链表允许插入和移除表上任意位置上的节点(但是不允许随机存取)

链表的缺点

  • 不能像数组一样随机读取
  • 增加了空间的开销(增加了节点的指针域)

单链表

单链表在内存中的储存方式如下

在这里插入图片描述
data域是指的该节点储存的数据,而next域名存的则是下一个节点的地址,虽然链表是有序列表,但是其元素并不是连续存储的。

3.栈(Stack)

栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈,
在这里插入图片描述

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。是先进后出的原则

栈的作用
1 .数制转换

2.语法词法分析

3.表达式求值等

栈的基本操作创建栈,判空,入栈,出栈,获取栈顶元素等,注意栈不支持对指定位置进行删除,插入,其接口Stack声明如下:

/**
     * 移除此堆栈顶部的对象并将该对象作为此函数的值返回。 
     * @return 此堆栈顶部的对象(<tt>Vector<tt> 对象的最后一项)。
     *  @throws EmptyStackException 如果此堆栈为空。
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

4.队列(Queue)

队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头 (Front),队列的操作原则是先进先出的,所以队列又称作FIFO表(First In First Out)

在这里插入图片描述
队列的应用
【举例1】银行排队
【举例2】模拟打印机缓冲区。
在主机将数据输出到打印机时,会出现主机速度与打印机的打印速度不匹配的问题。这时主机就要停下来等待打印机。显然,这样会降低主机的使用效率。为此人们设想了一种办法:为打印机设置一个打印数据缓冲区,当主机需要打印数据时,先将数据依次写入这个缓冲区,写满后主机转去做其他的事情,而打印机就从缓冲区中按照先进先出的原则依次读取数据并打印,这样做即保证了打印数据的正确性,又提高了主机的使用效率。由此可见,打印机缓冲区实际上就是一个队列结构。
【举例3】CPU分时系统
在一个带有多个终端的计算机系统中,同时有多个用户需要使用CPU运行各自的应用程序,它们分别通过各自的终端向操作系统提出使用CPU的请求,操作系统通常按照每个请求在时间上的先后顺序,将它们排成一个队列,每次把CPU分配给当前队首的请求用户,即将该用户的应用程序投入运行,当该程序运行完毕或用完规定的时间片后,操作系统再将CPU分配给新的队首请求用户,这样即可以满足每个用户的请求,又可以使CPU正常工作。

5.图(Map)

图是一种非线性结构。由顶点的有穷非空集合和顶点之间的集合组成通常表示为G(v,e),其中V是图G中顶点的集合,E是图G中边的集合。(这块不是很理解)

6.树(Tree)

在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树;

然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度
在这里插入图片描述


6.1二叉树


每个节点最多含有两个子树的树称为二叉树。

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上

完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

二叉树的遍历方式:

前序遍历(Pre-Order Traversal):先根节点->遍历左子树->遍历右子树

中序遍历(In-Order Traversal):遍历左子树->根节点->遍历右子树

后序遍历(Post-Order Traversal):遍历左子树->遍历右子树->根节点

6.2动态查找树

二叉查找树是二叉树的衍生概念:

二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。

6.3平衡二叉树(AVL树)

平衡二叉树:当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

其中AVL树是最先发明的自平衡二叉查找树,是最原始典型的平衡二叉树。

平衡二叉树是基于二叉查找树的改进。由于在某些极端的情况下(如在插入的序列是有序的时),二叉查找树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。所以我们通过自平衡操作(即旋转)构建两个子树高度差不超过1的平衡二叉树。

6.4红黑树
红黑树也是一种自平衡的二叉查找树。

1.每个结点要么是红的要么是黑的。(红或黑)
2.根结点是黑的。  (根黑)
3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  (叶黑)
4.如果一个结点是红的,那么它的两个儿子都是黑的。  (红子黑)
5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。
在这里插入图片描述
6.5 B树
B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有最多2个子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。

6.6 B+数
B+ 树是一种树数据结构,通常用于关系型数据库(如Mysql)和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点 中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

b+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,b+树相对于b树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少。
在这里插入图片描述

举报

相关推荐

0 条评论