00:00
好了同学,那接下来咱们就开始上课了啊,我们上午在最后的时候说呀,我们这个数组这个东西啊,它有可能怎么着啊。有可能存满了是不是。那存满的话,它涉及到一个问题,就是扩容吧。是吧,哎,我们可以用笔简单一下啊,就是说。我们可能原先这个数组啊,它里边只能存什么呢?哎,比如说1234个元素,那如果呢,他还想加第五个元素,那这个数组不够啊。是不是,所以说你可以怎么着呢,在我们Java语言当中是这样的啊,数组呢,它可以创建一个怎么着更大的一个数组。因为数组的长度一旦确定不可改变,所以这个时候呢,你要想干什么呀,要想扩容,实际上实际上就原先这个数组就不用了啊,你就把原先这个数组怎么弄啊,要拷进来。对吧,哎,这个给它拷过来啊,这个拷过来,这给它拷过来啊,然后接下来这个数组它的内存空间就给它释放掉啊,不要了,然后接下来在这儿呢,加入新元素,这样的话就完成了数组的一个扩容啊,数组的扩容需要一个数组的拷贝,就数组元素拷贝啊这块的一个操作,呃,那么拷贝这个东西呢,咱们实际上是不用我们写的,三公司已经写好的。
01:15
啊,我们直接用就行了。啊,就是system这个类里边有个every copy,这是完成数组拷贝的,我们通过数组拷贝可以完成扩容吗?对吧?哎,我们扩容为了干什么呀,为了容纳或者是容量更多更多的元素啊,是这样一个情况。啊,那我们为了扩容就得先拷贝是吧,那咱们一起来看看拷贝这个方法。这个方法呢,是every copy啊,是system这个类当中的静态方法。啊,我们在这里呢,再看一下。System是吧,你不要光知道system.out是不是,哎,它还有一个叫什么呀?哎,叫做这个every copy。你看还有这样的一个静态方法。
02:00
是不是,哎,静态方法。那么这个方法呢,有很多参数是不是啊,有很多参数,有几个参数呢?我们可以看一看源代码点过去了啊走。是不是啊,有这么几个参数,第一个参数是一个object。他为什么是有object呢?为什么不是个数组呢?啊,哎,因为object更通用。你是一个object,能不能传过来呀。可以啊。啊,你是一个数组,是不是也可以传过来,都可以传过来是不是啊,所以这是多肽嘛。你看。这个是拷贝的圆啊。这个是从哪哪个位置开始考。这是拷贝的目标吧,就相当于把这个数组当中的东西给它拷贝到哪儿,这个数数组里边是不是。考证需要指定一个起点。还有你拷贝的长度。
03:00
啊,这是什么意思呢?来我们一起看一下啊。比如说我们这儿呢,有一个数组。简单的。画一下。啊,然后呢,我们数组当中有一些元素嘛,是不是哎,比如说11122。对吧,哎,三四。那这边呢,我们还有一个什么呀,大的数组啊,就简单画一下得了啊。大数组。好,你比如说12345。假如说我是想把这个里边的。这两个元素。拷贝到我这个位置上。懂什么意思吧?
04:01
啊,这个幺幺到这儿。是不是这个二二呢,到这儿吧。哎,我要这个数组,我们叫拷贝员。拷贝源啊,就是水源的源,源头的源啊,拷贝源。这是目标。这个是目标啊,哎,目标你就是要从我们上面这个拷贝源上拷贝数据放到我们目标上。所以你在代码当中你会看到有个圆和目标。这个就是那个圆,就是那个目标。那么这个位置是什么呢?这个位置是其圆的起点下标。你看。所以你这个下标是零啊,你这个下标是一啊,对吧,你这个下边是二,你这个下边是三,你这个下标是四。所以说呢,我们圆它的起始位置从哪儿啊,哎,从这个位置开始。
05:00
对吧,那这个位置的下边是零,这是一,这是二,这是三对吧?哎,这是四,这是五,这是六,这是七。那你目标这个数组,它的起始位置从哪开始啊?从下标为三的位置开始。也是你需要五个参数,各位啊,这五个参数只要指定好就可以了。第一个是圆,第二个是圆的起点。啊,第三个目标。第四个目标的。起始下标。然后第五个参数是你考多长。你只要把这五个参数指定,它就可以从这给你拷过来。我们可以看一看程序这块啊,啊,当然底层源代码你看不见是吧,是C加加写的,因为是native嘛。是不是native啊,我们直接用就行了,我们可以在这给一个嘛,对不对,给一个数组。S2C。
06:01
那这个数组圆这块的话,咱们。给一个各位啊,给一个啥呢。就给我们这个吧,1112234。要。幺幺。2234行吧,哎,然后呢,这个是我们就拷贝元。啊,就是从这个数组中拷贝,就这意思。那拷贝目标位置。就是拷贝到这个目,这个目标上,或者目标数组上,那这个呢,我们可以再给一个。是吧,哎,我可以给一个啊。比如说这块的话,咱们就。直接溜吧,有一个大一点的。20。
07:00
行不行,哎,20,然后接下来这这是什么意思啊,这是动态初始化一个长度为20的数组,对吧?每一个元素默认值零。是不是好,那么接下来呢。我们再往下就是调用什么呀,调用jdk system类中的every copy方法来完成数组的拷贝。那行吧,Sister every copy,大家看这个方法,第一个参数是src,你就可以把上面这个SC拿过来。从这里边考。是不是哎,从哪个位置,从起点,第二个位置就是起点啊,CTRL加P可以看参数啊,第二个位置是起始位置,Int类型是下标。那我们要从哪考啊,零从一这个位置开始考,所以这写个一行吧,哎,然后再CTRLP看一看,第三个参数是目标,那这个是不是就是目标数组啊,就你从这个数组里边拷贝吗?起点这个位置拷到这个数组当中,那么拷到这个数组当中之后,我们。
08:20
考到这个数组里边是吧,那么起始位置是哪啊三对不对,那第三个参数就是三呗,起始位置第四个参数考几个呀,因为你要把上面的这个十一二十二考考过去,这是考两个,所以二啊就是长度。啊是这样的,圆圆的起始位置,目标目标的起始位置以及拷贝长度。那么接下来我们拷贝之后,对吧,我们遍历什么呀?便利目标数组。就它不是把这个东西不是考这个这里边了吗?你对它进行遍历for循环,你看看它考没考进去,I等于零,开始I小于什么呀,这个目标数组点什么Les I干什么呀?加加每循环一次呢,输出这个目标数组下标为I的元素。
09:09
那么这个结果应该输出什么呢?应该输出0001122000,前三个是零。0001122,然后往后都是什么呀?哎,都是零。我们来看一下是不是这个情况,各位啊,来走。你看看一下啊,大家看000前三个是不是零啊,哎,再往后是不是11和22啊。对吧,哎,这样就完成数组拷贝了,以后你要完成组拷贝的话,你就直接叫system,它的一个every copy方法,把这五个参数给它传进去,这样的话就可以很轻松的完成数组的一个拷贝啊,拷贝员是什么?拷贝的目标是什么,对吧?从这拷到这儿是不是?哎,当然你还可以这样做。
10:05
有人说老师我想把这个东西全部给它拷进去,我应该怎么做呀?哎,来,我们把这个代码注释掉啊,把这段代码我们再注释着它。我们重新给他拷贝一下。那么这个怎么考呢?是这样考的,system.every copy copy这个目标原是src,目标是一个什么呢?目标,呃,不是目标啊,起始位置是零吧,对不对?哎,从这个位置开始考,那拷贝到谁里边呀,拷贝到我们这个目标上。是不是,哎,那这个目标它的起点是几啊,也从零开始行吧,哎,拷贝多长啊,拷贝src的Les。好,这个大家能看懂吗?也是五个参数,第一个参数是什么呀?是元,第二个参数是什么呢?哎,是起始位置,第三个参数是目标,目标的起始位置对吧?然后拷贝多长,那么这样的话就相当于把S2C这个里边全部拷进去了啊全部拷进去之后呢?哎,我们再来对它进行循环。
11:17
我们再来把它输出,哎,这个结果呢,它就是什么呢?哎,我们一起看一下啊。来,我们去。运行。好,大家看一。十一二十二三和四是不是前几个都考到这儿了,后边这几个都是零,它的原因是什么呀?是因为你采用的是一个动态初始化的方式,对不对?默认值每一个值都是零啊,都是零,那有的学老师可以拷贝基本数据类型,如果数组里边是个引用数据类型,能拷贝吗?当然可以啊,数组中如果存储的元素是引用,可以拷贝吗?那当然可以啊,可以拷贝没有任何问题啊来,那么这块的话,咱们可以演示一下啊,演示一下比如说现在是一个词论吧数组。
12:13
行不行,Str或者是sts来。Hello。啊,Word。啊,嗯,然后study。然后是Java。啊。然后是Oracle啊,随随便写吧,买circle。啊,再来一个JDBC,这是一个字符串数组啊是吧,那这样的话我们再来一个新的。字符串数组,比如说我们这个呢是20,那接下来拷贝,我要把这个里边的东西拷到这个新数组当中,怎么拷啊,System点什么。
13:01
Every copy是不是?哎,那么第一个参数是它从零开始呗,对不对,第二个参数是它啊,也是从零开始对吧,拷贝多长啊,哎,给Les。对吧?我们整个数组全部的元素都拷贝到这个数组当中,那么接下来我们在这里对它进行for循环。I等于零,I小于什么呀?我们这个数组叫做什么?New s条点什么呀?Les干什么呀?I加加对不对?说出什么呢?哎,New sts这个数组下标为I的元素。应该是从这里拷贝到这里之后,我这个数组里边前几个元素都是这些东西,但是剩下的都是nu对吧,因为你采用动态初始化的方式,20个nu嘛,是不是来我们运行一下。啊,前几个来从这开始看是吧,Hello word study Java Oracle myle JD bc是不是,哎,往后你看是不是都是none啊,哎,都是none啊,这几个全部合起来,哎,你也不用数了啊,它肯定是多少个呀,20个啊,肯定是20个。
14:10
因为这个数组长度是20嘛,对不对啊,你不仅是可以可以是这样的啊,你还可以采用,你还可以是别的类型是不是,哎,别的类型啊,比如说object数组OBGS对吧?哎,然后接下来我们在这里给一个object,比如new object。是不是,哎,然后呢,又new一个OBJECT2个对象吧,是不是,哎,两个对象,然后呢,再来一个对象。对吧,哎,你现在呢,有一个新的哎数组啊,你一个object是不是,哎,比如说十个。对吧,那你可以拷贝啊system.every copy拷贝谁呀,把OGS从零开始考。对吧,拷贝到哪儿new里边。啊,从哪开始,从零开始拷贝多长ogs.les我这个数组里边三个元素对吧,我都给它拷进去。
15:06
好,我问大家问题,这个拷贝拷贝的是对象还是对象地址。思考一下。这里拷贝的时候是拷贝对象还是拷贝对象的地址?那肯定是地址是吧,肯定是地址,他不会说拷贝的时候再把这个对象再创建一个新的,那也就是说我们在从第47行开始吧,对吧?哎,47行开始到哪呢?到我们四十八四十九五十这几行代码,实际上创建的这个object这个对象啊,一共就三个。啊,一个两个三个,实际上是把这三个对象,它的内存地址是不是放到了这个数组里边啊。然后实际上是这个数组里边这个对象的内存地址是不是拷贝到了一个新的数,新的数组当中,底层对象是不是还是这几个对象啊。对吧,还是几个对象。
16:03
这个从内存方面我觉得你应该是可以理解的啊,来for循环,I等于零,I小于什么呢?I小于OG,不是new new OB GS点什么呀,Les。对吧,哎输出什么呀,叫new OB GS什么呀,还有我们的一个一个一个叫哎下标。是不是啊,那这里自然会调动的,To方法就不用管了,是不是啊。哦,Java不提供没有。Java里这个东西便利。便利没必要提供啊。胡了,便利有必要提供吗?知道为什么?知道为什么他不提供吗?原因很简单,因为for循环里边具体写什么代码。具体写什么代码?
17:02
S公司能能为我们做主吗?以后我们开发都是c.out吗?难道以后我们开发C他点out吗?我们不是这个啊,不是这个代码,这个代码不是不能封装啊。因为你以后这个代码的业务不一样啊,你你你好像现在学这个东西都好像每一次循环的时候,你看都在这干啥呀?哎,都是给他输出输出输出是不是啊,那以后的话你不一定在这输出了,你有可能在循环过程当中,你要做别的事情。那像这种代码散公司也肯定不会帮我们封装的,封装的没有意义啊,对不对,你要自己愿意玩的话,你自己可以弄一个工具类啊,无所谓。对,你可以自己弄一个工具类以后呢,输出的话对吧,你就调一个工具类的方法不就行了吗?是不是,哎方法就可以了啊行了解一下了解一下啊,不过这个问题问的不错啊,问题问的不错。好了大家看啊呃,这。区分不开了。在这儿我打一条横线。啊,打一条横线来再去执行。
18:06
好,大家看前三个这个Java object对象是不是就过来了,这是吧,哎,后边是不是都是none啊,哎,都是none啊。好的,那这个例子最主要是跟大家聊一聊什么呢?聊一聊我们数组的一个扩容的事儿啊,就是扩容这个东西呢,其实呃,每一次扩容它的效率比较低一些,因为涉及到数组元素拷贝的一个问题,所以建议大家以后在实际的开发中啊,你能够合理的去指定我们数组的一个长度,哎,你预估计它有多少对吧,你就给他一个多大的空间,这样的话,它将来扩容的次数少了,那这个数组拷贝的次数少了,那效率啊自然就上去了啊,效率自然就上去了,但如果说有一天让你进行数组拷贝的话,我希望各位同学能够记得system sun公司提供的这个类,就这个类啊,它不止有一个out printline,它还有一个叫every copy的东西,传上五个参数,然后就可以很完美的完成什么呀,数组元素的一个拷贝啊,数组元素的拷贝。
19:08
那么数组拷贝呢,和我们数组当中存储的元素类型无关,你元素是数组中是字符串可以没问题,数组里边是什么基本数据类型也没问题,数组里边是object也没问题啊,都行,都可以给你考啊,都给你考,但是你要注意啊,像这个拷贝是怎么考的?啊。其实我我倒是可以把它这个这个内存图这说一说啊,内存图说一下。我简单画一下啊。保存一下这个吧,这个是数组拷贝,对23。数组拷贝内存图。啊,来简单在这画一下,这个呢,假如说是一个GVM。我不画那么多了,各位啊,不画那么多了。
20:00
呃,那么这块呢,我就画一个堆吧。方法区域我也不画了啊,这是个堆。啊,然后呢,这是一个站。站啊。Stack。对啊,因为string我还没讲呢啊,其实比较特殊。来咱们继续啊,就比如说这个吧,对吧,New object new new是不是放到这个盒子里边了,这是不是OBDS啊好,那这样的话我们来看看啊,他创建了三个对象放到这个数组里边是怎么做的。实际上相当于啊在这啊,New了一个object new了个object,明白吧,又new一个object,是不是new了来new出来了啊,New一个object对象啊。啊,这个也是一个object对象啊。
21:05
然后呢,这个也是object对象。那么这三个对象有三个内存地址,是不是它放到了这个大括号当中,大括号就相当于是一个数组嘛,数组就是一个对象,所以这是个数组。明白吗?啊,这个数组啊,嗯,这个数组这一块呢,我我我简单画一下。这画一个画一个。这是一个object数组啊。不写了。那这个位置是什么呀?是0X1234呗。对吧,哎,他去指向谁啊,指向这个对象啊。对不对,这就是这个对象嘛。我们这个对象。是不是啊,然后这边呢,有一个0X5897。这个说的谁呢?说的是这个对象。
22:01
这个对象啊各位。然后呢,紧接着呢,下边这个又是一个新的对象,0X4789。啊,随便的啊来。这是这个对象。是吧,哎,这个对象啊,然后接下来呢,实际上这个位置它是有一个内存地,它这个数组首元素有内存地址啊,0X11。对吧,那这个呢,就是空间地址是连续0S12嘛。是不是啊,大概是这个意思啊,这个位置就是0X什么呀幺三。是不是,哎啊,这个是我们数组元素的一个一个地址啊,这里边存的东西,下边这是存的东西啊来,别理解错了啊,这是存的一个盒子里边的东西,这是你去超市啊,你背的那个包放在里边了,明白吧,哎,背的包放在里边了啊,放在里边了。那么这个呢,就是我们的一个现在的情况,那拿这个0X11就付给谁了呀,就付给他了。明白吧,啊,就到这了。
23:00
这我简单画一下吧,我就不画那个什么门放战争了啊,就直接拿过来了,哎,这块有什么呀。变量是不是啊,这个变量里面保存什么呀?0X11你懂吗?0X11数组的什么首元素的内存地址作为什么整个数组对象的内存地址吧?哎,这就是那OBGS。是不是,然后这个内存D指向谁啊,指向它。啊,这就是那个数组,它的这个情况啊,就是这个德行。那么接下来呢,数组进行拷贝,是不是你是不是在这拗了一个object数组,然后里边是十对吧?哎,那这个时候是怎怎么回事啊,就相当于是说啊,在这用了一个新的数组啊,十个捺。然后怎么着呢。赋给了这样一个这样一个局部变量。啊,这个画的比较费劲了啊。我应该少点这样吧,同学们我改一下吧。我改一下啊。我偷个懒,改个五行吧,改个五少花点行吧。
24:02
好。创建个对象。数组啊。嗯,一个。两个。三个。四个五个。行吧,哎,然后这块是什么呀?哎,那啊。那。对,你这几个都是那。哎,这个也是那。啊,这个也是钠,哎,这个也是钠。这样。那么这个速度创建出来之后呢,你这个第一个元素啊,它的内存地址0X55吧。这是0X560X56。啊,这可能是0X57。0X58。0X59。对吧,哎,那现在你这个元素的一个这个数组对象的首元素内存地址,作为整个数组的内存地址嘛,就相当于是他嘛,是不是,哎拿过来放哪了,放这了。
25:11
这里边儿有个什么呀,有个变量呗。对不对,X变量里边保存一个内存地址吧,叫啥呀,0X什么呀。啊,那这个就是那个电量啊,然后这个内存地址呢,就指向数组首元素啊,首元素是这样一个情况,目前啊,那好,那这个程序继续再往下走,就是拷贝了system every copy说OBGS上面这个数组往下边这个数组里边拷贝。从这个数组的零下标开始。这个拷贝的这个也是从零下标开始,那这样的话我们是怎么做呢?就相当于说这个位置的。谁呀谁考过来,各位。就把它吧。是不拷贝一份啊。拿过来放哪了?
26:00
是放这了。嗯。啊,然后把谁把这个盒子里边放的这个东西啊,拷贝一份干啥呀,哎,拿过来了。明白吗?他会把这个怎么着啊,哎,也拷贝一份。怎么着呢?哎,也给他拿过来放这儿了。对象实际上还是原先的三个对象。只不过现在怎么着啊,哎,这个地址也指向他。啊,颜色我改成黑色。指向它,你看这个呢,指向它。这个呢,指向谁啊他。那是这样一个意思,各位啊,数组拷贝并不会说把这个数组里边这个对象再考一个新的,不会导致这个object多俩。原先三个变成六个了,不可能啊,原先三个对象还是原先三个对象,只不过在数组拷贝的时候,拷贝的是我们数组当中存储的这个东西,拷过来指向了这几个对象。
27:04
啊,指向这几个对象。好了解一下啊,了解一下,这是数组拷贝啊,数组拷贝。
我来说两句