Java 中常见的数据结构

1、数据结构有什么作用?

当使用 Java 里面的容器类时,你有没有想过,怎么 ArrayList 就像一个无限扩充的数组,也好像链表之类的。很好使用,这就是数据结构的用处,只不过你在不知不觉中使用了。

数据结构内容比较多,细细的讲解也是相对费功夫的,不可能达到一蹴而就。我就将常见的数据结构:堆栈、队列、数组、链表和红黑树 给大家介绍一下,作为数据结构的入门,了解一下它们的特点即可。

2、常见的数据结构

数据存储的常用结构有:栈、队列、数组、链表和红黑树。

  • stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。

    简单的说:采用该结构的集合,对元素的存取有如下的特点:

  • 先进后出(存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。
  • 栈的入口、出口的都是栈的顶端位置。

需要注意的 2 个名词

  • 压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
  • 弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

队列

  • 队列queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

    简单的说,采用该结构的集合,对元素的存取有如下的特点:

  • 先进先出(存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。
  • 队列的入口、出口各占一侧。
栈和队列的结构图:

数组

  • 数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。

    简单的说,采用该结构的集合,对元素的存取有如下的特点:

  • 查找元素快:通过索引,可以快速访问指定位置的元素
  • 增删元素慢

    指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。

    指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。

    数组的结构示意图:

链表

  • 链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。

    每个结点包括两个部分:

    ? 一个是存储数据元素的数据域,

    ? 一个是存储下一个结点地址的指针域。

    链表结构有单向链表双向链表

    采用该结构的集合,对元素的存取有如下的特点:

    • 多个结点之间,通过地址进行连接。
    • 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素。
    • 增删元素快:
      • 增加元素:只需要修改连接下个元素的地址即可。
      • 删除元素:只需要修改连接下个元素的地址即可。

红黑树

  • 二叉树binary tree ,是每个结点不超过2的有序树(tree)

    简单的理解,就是一种类似于树的结构,只不过每个结点上都最多只能有两个子结点。

    二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。

    结构示意图:

二叉树的一种比较有意思的叫做红黑树,红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。

红黑树的约束:
  1. 节点可以是红色的或者黑色的
  2. 根节点是黑色的
  3. 叶子节点(特指空节点)是黑色的
  4. 每个红色节点的子节点都是黑色的
  5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
红黑树的特点:

? 速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍。

原文地址:https://www.cnblogs.com/miantiao312/p/10741945.html

时间: 2024-08-01 09:50:30

Java 中常见的数据结构的相关文章

Java中常见的数据结构的区别

把多个数据按照一定的存储方式,存储起来,称存储方式之为数据结构. 数据的存储方式有很多,数组,队列,链表,栈,哈希表等等. 不同的数据结构,性能是不一样的,比如有的插入比较快,查询比较快,但是删除比较慢. 有的删除比较快,插入比较快,但是查询比较慢. 根据实际操作,合理选择即可. ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于

Java中常见的5种WEB服务器介绍

这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomc

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

Java中常见的设计模式

我在这里稍微总结一下Java中常见的一些设计模式. 1,单例设计模式 单例设计是Java中最常见的模式之一,,它就是要保证程序里边只有一个对象实例.就好比班上都叫他为班长,是因为得保证班上只有一个班长. 单例设计模式的程序设计思想反应的是Java面向对象思想的封装特性.就是为了保证只有一个对象实例,我们私有化它的构造函数,对外只提供一些相关的 公共方法来获得对象实例. 单例设计模式的实现主要分为饿汉式和懒汉式 饿汉式是先对类的对象实例化,随着类的加载对象也加载进来缺点是会造成性能的损耗好处是实现

Java中常见的jar包的用途

jar包用途  axis.jar   SOAP引擎包  commons-discovery-0.2.jar   用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期管理的常用方法.  jaxrpc.jar     Axis运行所需要的组件包  saaj.jar 创建到端点的点到点连接的方法.创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法.    wsdl4j-1.5.1.jar Axis运行所需要的组件包  activation.jar JAF框架的jar

竞赛中常见的数据结构

这篇文章结合15pku暑期training的资料,简单介绍几种竞赛中常见的数据结构,包括线段树.树状数组.伸展树.后缀数组.并查集等. 需要点明的这,这个专栏的文章可以视作一个“预处理”,是作为笔者16年暑期pku集训的一个先导,因此拘于时间和精力很多知识点都是从整体上把握,缺少细节缺少证明也缺少代码实现,这些东西笔者会在以后的训练中详细的介绍出来. 线段树: 对于细胞和人口的指数级爆炸我们都很熟悉,而在算法设计当中,最忌讳的也是出现O(2^n)的时间复杂度,我们将这个计算过程视为正向,那么我们

Java中常见的Exception种类

1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodException 5.SQLException 6.RuntimeException Java中常见的Exception种类

一、javaSE (十七)set集合、Collection集合、针对Collection集合我们到底使用谁、在集合中常见的数据结构

1:set集合(理解) (1)Set集合的特点 无序,唯一 (2) Hashset集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法: hashCode()和equals() 执行顺序 首先比较哈希值是否相同 相同:继续执行equals()方法 返回true:元素重复了,不添加 返回fa1se:直接把元素添加到集合 不同:就直接把元素添加到集合 C:如何保证元素唯一性的呢? 由 hashcode()和equals()保证的 D:开发的时候,代码非常的简单

Java中的数组数据结构需要了解的要点

. 首先,数组是Java中的对象.它们不是像int.short或long这样的基本类,也不是具有很多方法的全功能对象,但由于它们是对象,所以它们隐式地扩展了Object,这就是为什么可以使用数组引用(例如toString())调用java.lang.object的任何方法. Java中数组的另一个重要之处是,一旦创建,就不能更改数组的大小.好奇的开发人员可能会问,我们如何在Java中拥有像ArrayList这样的动态集合,可以在饱和的时候调整自身大小?好吧,扩容不像你想得那样,可以简单地增加一个