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源码注释:

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操作次数也更少。

Java的数据结构有那些?相关推荐

  1. Java常见数据结构以及特点、使用场景

    Java常见数据结构以及特点 Java中常见的数据结构,主要分为Collection和Map两种主要接口,程序中的数据结构是继承这些接口的数据结构类. Collection接口: List 接口继承: ...

  2. Java数据结构类如何使用_Matlab如何使用Java的数据结构类型

    Matlab 2008b才开始引入containers.Map,这是Matlab唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型).如果要有其它,比如Queue.Set等 ...

  3. java堆 数据结构 堆_Java中的紧凑堆外结构/组合

    java堆 数据结构 堆 在上一篇文章中,我详细介绍了代码对主内存的访问方式的含义. 从那时起,我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问. 有些模式可以使用数组支持的结构来应用 ...

  4. 基于java的数据结构学习——数组实现的栈以及简单应用C++实现

    基于java的数据结构学习--数组实现的栈以及简单应用的 C++ 实现 源码: // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTUR ...

  5. 用Java描述数据结构之线性表的链式存储(链表),模拟LinkedList实现

    上一篇介绍了顺序表:用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍 上一篇博客中说明了什么是线性表--线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理 ...

  6. Java 并发数据结构

    java 并发数据结构 并发数据结构在数据添加和删除时: 阻塞式集合:当集合为空或满时:等待: 非阻塞式集合:当集合为空或在满时:不等待,返回null或异常. 1. List 不安全: ArrayLi ...

  7. Java树数据结构? [关闭]

    本文翻译自:Java tree data-structure? [closed] Is there a good available (standard Java) data structure to ...

  8. java堆 数据结构 堆_快速堆数据结构

    java堆 数据结构 堆 In this tutorial, we'll be discussing and implementing Heap data structures in Swift. 在 ...

  9. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  10. Java版数据结构之单向链表

    Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...

最新文章

  1. WPF窗口长时间无人操作鼠标自动隐藏
  2. IT公司100题-27-跳台阶问题
  3. Android—打包aar以及module依赖操作
  4. 利用MFC向导生成单文档应用程序框架
  5. php 面向对象编程(class)之从入门到崩溃 基础篇
  6. vs2019创建c语言,Visual Studio 2019安装、测试创建c语言项目(图文教程)
  7. Oracle的表使用plsql导出excel文件
  8. mysql 5.7.26卸载_MySQL 5.7.26安装与卸载
  9. 机器学习面试题60~100
  10. The eighth day
  11. R语言1-面板数据分析全过程 附代码用途
  12. 网盘、云盘共享文件搜索引擎链接收藏目录
  13. 习题6-5巡逻机器人 UVa 1600 bfs
  14. Window脚本学习笔记之定时关闭进程
  15. java架构师培训班,太完整了!
  16. linux内核开发(基础)
  17. 播音计算机论文,广播中计算机的应用论文
  18. 重启windows资源管理器
  19. python 当前路径 搜索路径图某一个不包含_python编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径...
  20. 如何用matlab算导数曲线,excel 曲线求导_excel怎样对表格中数据进行求导

热门文章

  1. 【C语言】17-预处理指令3-文件包含
  2. 三菱驱动器参数表_三菱 M 参数表
  3. datagrid嵌套使用ajax,关于easyui datagrid多层嵌套动态合并列的问题
  4. 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
  5. linux下卸载之前安装的qt4和qt5
  6. 怎么用谷歌或百度搜自己在csdn内的文章呢?
  7. java entitybuilder_Java MultipartEntityBuilder.setContentType方法代码示例
  8. MySQL 入门(二)—— MySQL理论基础
  9. (附源码)php小型网络舆情平台设计 毕业设计 252324
  10. KCG-VISION:简介(一款快速开发机器视觉的软件)