java源码系列:技术的本质?数组到底是什么?数组为何查询快插入慢?

目录

1、技术的本质

hashmap的本质是一个程序

hashmap的数据结构

2、什么是数组?

3、为什么我们数组他查询会比较快,插入会比较慢?

(1)数组为什么查询会比较快?

(2)数组为什么插入(删除)会这么慢?


1、技术的本质

我们要学东西的话,我们不可能是永远都停留在使用级别,如果是停留在使用级别的话,我相信大家的薪资肯定上不去。

所以在这里呢,我们就要学习他的技术的本质,那什么是技术的本质呢?

有些人他的工作,两三年他可以拿四五万,对吧,那有些人呢,工作两三年了,他的薪资只能只能拿一两万,那为什么差距这么大?

其实就是技术的本质,很多同学只会去使用,但是不知道它其中的原理!

hashmap的本质是一个程序

废话不多说,我们技术的本质。那么我想问一下,hashmap的一个本质是什么?hashmap它是不是一个程序?

它就是为我们写好的一个程序,一个工具类的一个程序,那我们hashmap他实际真正能干嘛呢?

实际他是不是就是用来存储数据的,同样我想问一下,程序等于什么?程序是不是等于,我们的数据结构,加上我们的算法。

如果大家是科班出身的同学应该都知道这个,大家去看一下我们大学学的这个数据结构与算法里面,其中就讲到程序设计等于数据结构加上算法,对不对?

所以呢,现在在这个地方,我们这个hashamp,实际他就是一个程序!

它可以让我们的数据,可以存储起来,也可以进行查询,所以也就是说我们这个hashamp它就是一个程序。

hashmap的数据结构

那这样程序等于数据结构与算法。那我想问一下,我们首先来说一下数据结构,这个hashmap,你觉得他的数据结构是什么呢?或者说我们hashmap的底层实现是采用什么样的一个存储来进行实现的?

就是讲到数组和链表,当然还有一个叫做红黑树,那这个红黑树呢?

是在jdk8之后的一个红黑树,其实它是数组加链表加红黑树,是新增了一个数据结构,不是替换!

好,那我们现在讲一下算法,我们首先来去回顾一下数据结构的数组和列表,后面我们在讲JDK8的时候呢,我再去讲红黑树。

2、什么是数组?

数组:采用一段连续的存储单元来存储数据。

那我们知道在我们Java中怎么去表示一段数组呢?是用一个中括号进行表示

比如我们定义为10,那这个数组它的长度,就等于10,然后呢,我们可以对每个下标进行赋值。

我们的一个数据结构,肯定是有它的性能问题的。那我们评判这个性能问题的话,跟它的空间复杂度和时间复杂度有关。

它的时间复杂度为O(1),什么意思?就是它是一个代表常数级的,也就代表咱们这个数组,他的查询非常快。

那我们的这个删除或者插入呢,时间复杂度为O(N),他就没有咱们这个O(1)这么快。

所以我们数组,总结它的一个特点就是:查询比较快,但是他的删除或者插入,会比较慢。

3、为什么我们数组他查询会比较快,插入会比较慢?

(1)数组为什么查询会比较快?

那么我们先来看这里,对数组大家都知道是从下标0开始的,因为它又是一个连续的,所以如下图它是从0到5(012345),以此类推!

那么我们现在假设来举个例子,如下图:

为什么查询会比较快?

比如说我们现在去查这个monkey,那我首先先去找什么呢?

我首先先去找到这个monkey这个节点,它的下标,而它的下标值是不是 2 这个值?

所以,如果我们先去找monkey的话,先去找到它的下标值,那这个下标值其实是什么呢?

因为我们数组它是有特点的: 第一,它是连续的。 第二,它都是从0开始的。

所以,我们这个下标,其实就是我们数组它的索引,就我们找到这个下标时,就能立马找到我们想要查找的这个monkey。

那这个,其实就是我们数组它查询快的一个原因。 就是它的下标,其实就是它的索引号、索引位置。

(2)数组为什么插入(删除)会这么慢?

那么我们现在就已经了解这个为什么查询这么快,那为什么他的插入会这么慢呢?

那么我们来解释一下,比如我现在要在2和3之间插入一个元素,我现在在这里,我要插入一个monkey,

那如果说我插入的话,我直接在这里直接插是不行的,为什么?

如上图,数组它的定义是什么?  它的定义是需要一段连续的存储单元来进行存储,所以那很明显不行吧。

我们是不是违背了它的这个结构,违背了什么结构呢?违背了数组它的一个连续性的结构。

那这个时候怎么办?

OK,那如果是当这种情况的话,那我们这个下标所有这些值呢,都要改成什么?

那我们新插入这个节点是多少?是3

就是说我们刚刚在这个地方的节点,3就变成4,这个4就变成5,5就变成6,依此类推,

也就是说我们从这个节点下面,所有右边的这些,所有的这些节点都需要做相应的一些移位。

在这个移动的过程中,是需要消耗很大的一个性能,所以这就是我们为什么插入会这么慢的原因。

那同理可得,如果再去删除的话,也是一样,比如像我们现在把这个monkey,它的这个下标等于3,这个节点要删除。

那刚才我在这里改成等于4的,现在是不是要改回来等于3,这个刚刚这个5又改成4,以此类推,

所以这就是我们插入和它的删除慢的原因,就是因为它涉及到我们数组下标的一个移动。那这就是我们数组它的优缺点。

好,今天就写到这里。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值