常见数据结构总结

一.数组

数组是JAVA中最常用的类型之一,包括我们常用的ArrayList 也是基于数组来实现的. 那么 本篇总结第一篇要说的就是数组这个结构.

数组的官方解释为   由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中的数组元素我们称之为数组。

首先说一下数组的存储. 在内存中,jvm会为数组开辟一块连续的存储空间来存放元素,在创建时,我们需要指定数组的长度. 在此提一下创建数组的几种方式

 int[] a= {1 , 3 ,5 ,5 ,6 ,45 ,8 ,566};
 int b[]={1 , 3 ,5 ,5 ,6 ,45 ,8 ,566}; // 通常不用  这种示意不明确
 //int的构造器方法
 int[] c = new int[5];

如上述代码,前两行指定元素的创建方式,我们称之为  静态初始化. 而仅指定数组长度,然后由系统赋值的方式称之为动态初始化.

JAVA中的数组变量只是引用类型的变量,并不是数组对象本身,只有让数组变量指向有效的数组对象,程序中才可以使用数组变量。另外 数组中引用型变量的初始值为NULL   BOOLEAN 的初始值为FALSE   其他为其类型的0值  例如double 类型为0.00

JAVA中,数组一旦被初始化,其长度不可变化.每个元素会有一个代表其存放位置的索引,也就是角标Index. 角标位置是从零开始,也就是说 数组中末尾元素的角标是length-1   如果代码中不慎使用了超过其长度的元素 会造成极为常见的 数组越界异常 java.lang.ArrayIndexOutOfBoundsException

二.线性表

线性表包括顺序表和链表.以下为线性表的分类

线性表的特点:

(1)元素个数有限    (2)逻辑上元素有先后次序

(3)数据类型相同    (4)仅讨论元素间的逻辑关系

刚才在数组中简单提到了是顺序存储,在内存中开辟一块完整的内存空间. 但不同的是  线性表的角标从1开始,而数组是0

而链表则不是,链表中存储的元素通过引用(类似于C语言中的指针)连接起来,在内存中分布在各处,前一个元素的后继指向下一个元素的前驱,像一个自行车链条一样,因此得名链表.

顺序表相较于链表来说,增删较快,而查询较慢.下面贴个图来比较两者

1. 顺序表可以顺序存取,也支持随机存取;链表只能顺序存取。

2. 顺序表逻辑上相邻的物理上也相邻;而链表不一定,它是用指针来描述元素之间的关系。

3. 顺序表插入和删除要移动大量元素;链表只需修改指针即可

写到这里简单提一下Java中的ArrayList. ArrayList是基于数组实现的,但我们开发时 经常会对其进行添加操作,而且往往在新建一个实例对象的时候,并不会直接指定其大小. 原因是ArrayList 底层是有扩容机制的,也就是说,在添加元素超过了初始分配内存长度后,便通过扩容来存放. 具体细节将在下篇结合源码来进行分析.

下面看一下链式存储

链表由于其增删元素较快的特性,在开发中也被广泛使用,例如LinkedList 就是基于双向链表来实现的

在说双向链表前先聊一下单链表. 单链表其实很简单, 由header指向上一个元素  由此得到元素的顺序. 但是 这样的话 遍历这个集合便只能从第一个元素开始遍历,造成性能上的浪费. 所以LinkedList采用了双向链表. 元素前的header 和元素后的 next 会分别指向前后元素,由此可以通过任何一个节点来进行访问. 在a 和 c 之间添加元素b时   原本a的next 是指向c的header的  添加元素b只需将a的next 指向b的header 再将b的next 指向c的header  不用像顺序结构那样移动元素  所以说 链表的增删会更快一点 . 具体的也会在下篇中结合LinkedList 源码来进行学习.

三. 树

关于树的内容先看这个博客   自己理解也还不深  又不愿复制粘贴别人的   随后再深度学习更新 

https://www.cnblogs.com/polly333/p/4739567.html

四. 栈

Java中的Stack 是继承自Vector的    现在的应用场景并不是很多  但是也写一下帮助记忆

因为栈的数据结构类似与桶一样   只能从栈顶来拿数据  所以有了先入后出的说法 也有人称之为FILO(first in last out)

Stack类只有6个方法

pop出栈   push推入   peek 查看栈顶元素(但是不移除,连续peek都是同一个元素)    empty(判断是否为空)  

addAll(将某个集合添加到栈中)   add  size   就不多说了

栈也经常被称作堆栈    一直不太理解这个名词  一直以为是两个东西  直到看了位仁兄的博客说  中华文字博大精深   

往往哥哥称弟弟为 兄弟    其实这里的兄弟指的是弟弟    堆栈指的也就是栈    这样理解就明白多了

五.队列

队列的应用则非常广泛  常常看到某些企业招聘上写的熟悉RabbitMq  activeMq   虽然这些消息中间件我还没有研究过

但是了解到了 也是基于队列实现的  最近接手了公司的消息发送平台项目   看到里面广泛使用了阿里的RocketMq 决心要抽时间详细了解一下.

先简单记录一下Queue 的相关吧   明天总结集合类的时候再详细    队列顾名思义   是一种排队的机制   与栈相反. 人们习惯称之为先入先出.FIFO( first in first out )    与栈相同,都是操作受限的线性表.   不同的是 栈的模型类似于桶  只能从栈顶进 从栈顶出. 但是队列的话是从队尾进 队首出  好像我们上车排队一样

猜你喜欢

转载自blog.csdn.net/MiyaGi_/article/details/84825003