java常用的几种数据结构,堆栈,队列,数组,链表,哈希表
发布日期:2021-06-30 11:03:56 浏览次数:2 分类:技术文章

本文共 1721 字,大约阅读时间需要 5 分钟。

堆栈

 

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

先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。

栈的入口、出口的都是栈的顶端位置

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

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

 

队列

 

 

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

先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,安检。排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查。

队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。

数组

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

 

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

增删慢

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

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

链表

 

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

多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。

节点:两个部分:数据域(存储的数值),指针域(存储地址)

查找慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

增删快

增加元素:操作如左图,只需要修改连接下个元素的地址即可。

删除元素:操作如右图,只需要修改连接下个元素的地址即可。

 

ArrayList:

1.底层是数组;
2.查找快,可以直接使用索引定位,get是和set调用都是常数时间;
3.增删慢,代价非常大,需要复制;

get(i) 是O(1),add(0,str)是O(n)

LinkedList:

1.底层是链表;
2.查找慢,需要遍历,除非操作的头或者尾,本身提供操作头尾的API;
3.增删快;
get(i) 是O(n),add(0,str)是O(1)

 

哈希表

 

概念:底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表

当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。

即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。在哈希表中,每个哈希码值位置上可以存放多个元素。

总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

 

Hashset中存储元素的方法

1.给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等。

2.给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

 

转载地址:https://it4all.blog.csdn.net/article/details/77619591 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Redis数据库的命令行操作
下一篇:Type 'com.itextpdf.text.List' does not have type parameter

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月10日 02时48分58秒