【字幕】恋上数据结构与算法之014动态数组02接口设计
申请表数组英文单词叫away,而这个数组是怎么样的申请表?数组是一种顺序存储的申请表,什么叫顺序存储?就是数组里面的所有元素,它的内存地址是连续的,大家的内存是连续的,比如说举个例子,在Java里面,我想你有一个int类型的数组是这么这么搞的,那new是什么意思呢?像堆空间申请一段存储空间,像堆空间申请的存储空间,那这三个家伙放哪里?这三个家伙的话就放堆空间了,对不对?
好,那我们看一下,那这个代码在内存中是怎么表现的呢?这个代码在内存中的表现其实就是这个呃瑞,这个尔瑞其实是放占空间的,什么意思呢?像这个代码大家想想尔瑞这个东西啊,而瑞这个东西它肯定是个局部变量,既然它是个局部变量,它肯定是放占空间,那你右边这些数据呢是通过new获取的,所以它肯定是放堆空间,所以这个变量在占空间,这些数据在堆空间,相信大家是可以听懂了。
所以最终它的这个内存结构其实就是占空间里面有个尔瑞这个变量来指向对于空间的这个数组元素。
由于它是数组,由于它是数组,所以它们的内存地址是连续的,怎么个连续法?那假设1个int类型占4个字节,你看这个11它占了4个字节,就是这4个字节,那这每1个地址就对应1个字节,那这是每1个字节的地址值,你看11这个数据它所占据的4个字节对应的内存值分别是10111213,这就是它所占据的4个字节,那下1个元素它是从这里开始,我们可以发现他们内存地址是连续的,你看11的结尾是13,然后下一个14对吧?
就是22的开头,然后呢这个是22的结尾是17,然后呢他下一个18就是33的开头,那这个就足以证明了它们的内存是连续的,这个就是速度,这个就是速度。
在很多编程语言中的速度其实都有一个致命的这个缺点,什么缺点呢?无法动态修改容量,无法动态修改容量什么意思呢?比如说我这句代码,我这句代码只要一写完,这个数组的存储空间就三个元素,就只能放三个元素,这个数组里只能放三个元素,我想以后再往后面再放更多的这个元素,它不可能不可能。
就所以很多编程语言语言里面其实都有这样一个缺点,无法动态修改数字的容量,就当初当初你利用这个数组的时候,你空间是多大,那将来这个数组空间就是多大,它是无法修改这个容量了,但是实际上在很多时候我们实际开发中呢,我们是不是希望数组的容量是可以动态改变的,对吧?
那怎么样实现呢?一般来说我们做法是什么呢?一般来说我们做法就是自己写一个动态速度,自己写一个动态速度,什么意思呢?比如说假设我们自己写一个来,我们直接新建一个,新建完项目呢我们直接在这里用,一样的包名呢我就统一叫com点mj然后叫闷,那这个时候勾选一下这个man方法跟你搞定,那刚刚我们说到一个问题,就是这个数组啊在很多编程语言里面,只要你创建完这个数组,它的容量是无法改变的,比如说我们这样写吧,这个数组的容量永远都是只能放三个元素,我想在里面插入第四个元素,第五个元素是不可能的,那怎么办呢?
很多时候我是不是希望这个数组里面能无限的插入元素元素,能动态的插入元素,一般我们做法就是自己写个动态数组,那自己写个动态数组怎么怎么写呢?
比如说举个例子,假设我们自己写了个百纳米卡,啊瑞动态速度,我们假设我们自己写一个,然后将来用的时候可能就是这样子new一个动态速度,对吧?
我创建了我自己写的动态数组,而拿到我这个动态数组的,我应该提供一个方法,比如说a的添加元素,比如说它可以添加11,就是别人拿到我写的这个东西对吧?就可以添加11,遥控电压十二十三,甚至可以无限的往里面讲,重复的也行,不重复的也行,你看这里面就一共加了很多个元素,是不是应该设置成这样子啊?
而且也允许别人怎么样呢?删除人物,比如说0就将0这个位置的元素删掉,而且也允许别人怎么样呢?允许别人往某个位置添加元素,比如说往二这个位置添加一个33,对吧?应该是这样子。所以相当于就是如果我们能写出这么一个类的话,大家想一想是不是就是动态数组了?是吧?因为可以无限的扩充容量,随便你加要随便你删是这样子的。
那怎么去写这么一个动态数组呢?那现在我们就自己来写一个动态数组,那怎么写呢?首先这个类名呢我就起成叫呃瑞利斯的,我们就叫瑞利斯。好,那相当于是什么呢?相当于我这个released就是动态速度。
注意你看我在敲这个release的时候,你会发现有两个提示,一个是Java点YouTube,这是Java官方自带的一个release的,这个我们不要我们自己写一个我们a历史的所以不要选错了啊,我在选择我们自己的com点MC里面的好那相当于就是我这个就是动态速度,那我现在就是希望实现一个功能,我这个动态速度呢可以无限的扩充容量,所以现在先考虑一个问题,我们这个接口设计的问题,就是我们这个呃瑞丽斯的提供什么接口给别人去调用,提供哪些方法给别人去调用,这个叫接口对吧?
提供一个艾特艾特接口,提供一个本部分是吧?那提供哪些接口给别人呢?那接下来我们就看一下动态数组的一个设计,动态数组的一个设计,动态数组的一个接口设计的问题。我认为的话动态数组至少需要这些东西才叫动态数组。
我们来看一下第一个,别人调用我们size可以告诉他我们一共放了多少个元素,然后还有一个is empty,就是可以判断一下我们这个动态速度是不是空的,里面有没有元素,content就可以判断一下,你我我这个数组里面有没有这个元素,and就把这个元素加到我们数组的后面,get是吧?你给我一个索引,我就返回这个位置对应的元素,还有set什么意思啊?
就是你给我一个元素,我就可以把这个元素覆盖掉这个位置,之前的元素就直接覆盖,就设置这个位置对应的这个元素,那这个这个什么意思啊?
就是往这个位置插入一个元素,然后这个是删除这个位置对应的元素,那这个是查看一下你的这个元素在我动态速度中的一个位置,可立就把所有速度元素给删掉,好,我们看看怎么做这样子,为了节省大家时间,我直接将这个拷过来,注意我考的是什么,我考的是空的,同学们我直接将这个空的考过来,大家没有意见吧?
没必要我一个个敲给你看吧。
这个我敲出来,这个我敲出来,这个注释我写上去,这样你不觉得浪费大家时间吗同学们是吧?这个就非常浪费时间,所以像这种代码我就直接拷贝,不要浪费大家时间好吧?所以你看我们这些接口怎么去设计呢?而且注意啊这些接口是怎么样的?是公共的方法,既然你是提供给外界去调用的,所以你肯定要设计为公共的,肯定要设计为公共的啊那同学们可能有个疑惑,那你之前写的这个stick什么意思?
使得一个是静态方法,这是Java的语法问题,所谓静态方法就是可以通过类名去调用,比如说直接通过man这个类去调用这个man是吧?但是我们现在提供的这个接口怎么样是一定要创建一个创建一个对象才能去调用,所以应该设置一种对象方法,不应该写成死在那个好,这个是Java语法的部分,这个不多说了。
我们看一下这这个怎么去设计,那有了这些接口以后,是不是意味着别人拿到我们的就可以去用了,你看直接类似的艾特对吧就可以了。
好,那现在我们怎么去实现这样子?我现在先保证我这个动态数组能存放什么呢?Int类型的元素先好吧,int类型的这个元素,所以这个时候我我这个接口设计怎么设计呢?首先呃这一元素多少个,这样子我先返回0吧,先让它不报错好吧?然后这个是否为空先返回force,然后肯特斯应该是int,也就是说我添加的元素应该是int类型的,就是我现在先保证我这个能存放int类型的元素,比如说添加11 12对吧?
应该是传一个int类型的这个元素,然后如果你想判断一下这个元素在不在,你将来传了也是硬的,你传一个44 55我就我就判断一下这个东西在不在我这个数组里面,所以应该是硬的,先保证存放硬的,然后添加也是一样,你应该传一个int类型的元素给我,然后你你你要获取某个位置的元素,应该也是int类型的,就是我现在先放int类型的,那既然是int,那就不应该用空,空这个是只能用在对象身上,既然你是int的话,你你只能是整数,我就先返回0好吧?
然后这个site我是怎么做呢?Site是这样做啊,你传一个新的inter元素,然后我就将这个新的in into类型的元素放到index这个位置去,然后index这个位置原来是什么我会返回给你,所以我这里返回的int是什么?
原来的元素,然后这个是往index这个位置插入一个元素,这个是删除删除是吧?删除index这个位置的一个元素,而且我删除的是什么元素,我以后返回给你,比如说我删除的是22,我就把这个22返回给你,这里我先返回对。
这个index of什么意思啊?就是看一下这个元素的位置好,就这样子,好,现在应该是不报错了,我们先来看一下外面,外面我们来看一下点a的对吧?那这个没有问题,比如说往零这个位置插入22,本末伏一删除一这个位置的元素,这个没问题。那接下来这个东西怎么去实现呢?这个东西怎么去实现呢?