00:00
大家好,我是海波老师,我们继续来讲Java中的宿主,之前讲了一下宿主的基本使用方式,接下来我们继续我们这里呢,拷贝一个新的代码,我们写上一个零三啊,然后呢,我们点击OK,把里面的这个呀,我们都给它删掉了,写个零三,然后呢,把下面的咱们全都删掉,不要了。好,去掉以后,这个咱们也去掉就可以了啊好,那么我们还是啊从创建数组开始之前呢,我们创建数组的时候啊,我们是直接new的,所以我写上一个int。给它一个我们叫做numbers啊,等于new,然后呢,我们就int,然后写上一个中括号,给个三,我们讲过了,我们这里的int呢,它表述的是我数组中元素的类型,这个中国号呢就表示数组了,我们这个三呢,就表示当前数组的容量,那么你当给定为三之后,它表示当前的数组中最多只能容纳三条数据,你再多了是不允许的,对吧?这个我们之前提到过,当你把这个数组呢创建好之后,我们接下来呢,就准备给它往里面放值了,放值的时候呢,拿这个变量叫numbers,给他一个中国号,然后加一个索引,这个索引呢,我们也称之为叫下标嘛,然后呢,给个零,它是从零开始的,给他一个一,表述的是我当前的数据呢,是一,把一放在了我们索引为零的那个位置,对吧,我们说过了,我们的索引范围呢,就是我们的零到它的长度减一,长度为三,那么我们的所以呢是012对吧?这个地方只能写012,所以啊,我们就需要一个一个往里放数据,但是告诉大家,其实数据是可以不用增加的。
01:29
为什么呢?因为在咱们new的时候啊,Java虚拟机会被数组的每个小格子自动进行初始化赋值,如果呢是基本数据类型呢,那么初始值呢,就是这个类型的默认值,比方说啊,咱们这里是int类型,你不用给它赋值,它的默认值它就是零,所以呢,我们这里把它注掉,注掉以后我们这里给它来,我们叫numbers,第二我们for循环,For循环以后把每个值我们打印一下,写上一个number。好了,我们运行一下,你会发现我们这里的值它全是零,诶全是零,哎,老师啊,那如果不是int呢,诶我说过了,如果是我们基本数据类型的话,它的默认值是什么,我们打印的它就是什么,比方说我们的double。
02:10
咱们的double啊是浮点类型,那么所以呢,它的那个默认值呢,就应该是0.0了,所以我们运行一下运行。运行以后看结果,你会发现我们当前就是0.0,那如果是我们的布尔类型呢?诶我们的布尔类型,那么布尔类型啊,它的默认值其实就是false。好了,我们这里运行一下看结果,它的默认值呢,是我们的force,诶老师呀,那如果是我们的引用数据类型呢,比方说它是个对象,好,如果是一个对象的话,大家看一下,我写上叫object类型,咱们的所有的类,它的负类不都是object吗?所以我就写上它,好写完了以后我再去运行,运行以后你看结果,你会发现它的结果呢,就是空,那对吧?哎,老师,那咱们之前用的比较多的那个字符串,那它是什么默认值呢?所以呢,我们这里再写上一个字符串,其实啊,咱们的字符串呢,它也是一个对象,所以本质上跟那个object没有什么太大区别,所以我运行以后你会发现它这里呢,就是我们的那。
03:12
有的同学可能就误会了,他以为它是个空呢,所谓的空就是个空字串嘛,我们这里并不是啊,所以呢,我们其实啊,在我构建我们数据的时候,他就已经把一些值给我们复制好了,感觉上还是比较贴心的,但其实啊,这些默认值呢,并不一定是我们想要的,我们还需要重新给每个小格子赋值,其实有的时候感觉啊不是很方便,所以呢,我们Java呢,提供了另外一种构建数组的方式,也就是说啊,我们创建数组的同时呢,就把数据给它加进去,这里我们给大家演示一下。我先把它注掉,我们还是给大家创建我们的字符串数组好了,我们写上它string,然后呢,加上一个中国号,给它一个叫names,等于我们的大括号,大括号以后写个分号结尾,哎,你会发现现在的语法就已经是正确的了,为什么?因为啊,这就是一个空的数组,哎,老师你不说了吗?可以把数据直接给我添加好吗?我们这里就可以直接添加数据了,比方说我写个张三。
04:10
对吧,那如果有李四呢,加个逗号,写空格,再写上一个李四,然后写个逗号,再写上一个王五,那这样的话就等同于这个字符串,数组呢,我已经创建好了,那么它的长度呢,就是三,里面的数据呢,就是张三李四王五,好了,那我们打印一下,打印之后呢,我们写上一个names好了,我们现在运行一下,运行以后啊,我们来看一看我们打印的结果,你会发现它打印的是这样的一个字符串,这个跟咱们之前打印什么UR啊,Emp的感觉是不是差不多啊,这里面就会有个圈A后面有一个我们的16进制的数字吧,这个我们说过了,它就类似于咱们的内存地址的感觉啊,这个不用管它,前面这个地方是个中括号,它就表示数组的意思,而我们的这个呢,就表示数组中的元素,所以啊,我们打印的结果,它确实就是一个字串数组,但是啊,同学们,我们这么看看不懂啊,对不对,所以我希望呢,把每个值循环打印一下,所以跟之前一样,咱们叫names,点我们for循环,For循环以后我们这里直接打印好了。
05:10
那么接下来呢,我们就运行一下看结果了。那么结果当中你会发现张三李四往往没有任何的问题,对不对,那么这种方式呀,会感觉相对来说比较简单,并且呢比较直观,咱们这里的这个数组的长度呢,我们也打印一下啊,咱们这里来我们打印一下,咱们叫names,点我们的lengths,它有一个我们的属性,诶属性,这个属性呢,就是取得当前宿主的长度,所以我们运行一下运行。运行以后,我们当前的长度不就是三吗?所以啊,数组的长度呢,其实就是我们当前数据的个数,每一个数据呢,就是这个数组中的元素,宿主会按照顺序给里面的数据进行连续的编号,这个编号呢,我们称之为所以也称之为下标,它一旦确定以后是无法修改的。这里需要说明一下,数组中的元素和数组本身并没有从属关系,数据啊并不是数组的一部分,也就是说数组只是一个数据的容器,就像抽屉一样啊,你可以根据数据类型放置任何的数据,但是数据并不属于数组的一部分,咱们把这个图给大家画一下啊来,我们之前呢,给大家画了一个这样的数度,其实画的是有问题的,我们当时给大家讲这个的主要目的是想告诉大家,我们宿组的内部呢,是我们的一个一个小格子,然后呢,有个索引编号,对吧?哎,然后有数据,但是咱们现在要告诉你们呢,这个数据并不是这么存放的,所以我拷贝一下。
06:33
拷贝以后呢,我们往下来,哎,往下来往下来以后把张三李四王五给他删掉。删掉以后呢,同学们,我们说一下我们当前的宿主呢,它只是对数据的一种引用,所以呢,我们这里呢,把对象我们拿过来,我们真正的对象啊,其实在宿主的外面。啊,在数字外面,我这里呢,给他一个绿色的,然后呢,我写上一个张三。好了,写完了以后,我说过了,它其实是一个引用啊,所以我的箭头来引用我当前的张三,诶好了,那这样的话呢,我们的数据就等同于放到这里面了,哎,老师为什么说等同于放进去了呢?是因为当我访问数组中的第一个元素的时候,我通过这个箭头就可以取得这个对象的值,你说说不就这意思吗?所以啊,这个大家能明白的话,把图形补全了,复制。
07:22
复制了以后,这个呢,我改成叫李四啊,同样道理我们再来啊复制一下,然后呢,把这个改成我们的玩物就可以了啊啊。如果我们现在有三个字符串对象的话,那么数组中就仅仅包含了对我们的三个对象的引用,而不是把对象本身放进去了,所以啊,这里的宿主呢,其实是一个对象,只不过通过它呢可以组织和管理数据,所以我们说呢,我们的宿主啊,它其实是一种我们的数据结构啊,用于连续保存相同类型的数据,这个大家能不能明白,如果能明白的话,那么大家想想,如果数主也是一个对象的话,那么这个小格子能不能也放数竹呢?如果能放,那该怎么放呢?今天啊,同学们,我们来给大家演示一下,来拷贝,拷贝以后你不说了吗?数组当中的小格子放的是我数据的引用,而这个引用啊可以是对象,而我刚才说过了,咱们的数组就是对象啊,所以说我们能不能这样呢,来我复制一下,复制以后我往这儿放,然后呢,把这个去掉。
08:24
把它去掉,去掉以后同学们看,哎,我这么画。我这么画图什么意思呢?就是我宿主当中有宿主,哎,这个行不行呢?来把这个往这放。放完了以后,同学们,我们再来复制一个,复制以后呢,我们再复制,诶放过来,然后呢,我把这个箭头呢,我们也拿过来,同学们你看看这样的话可不可以呢?其实告诉大家是可以的,来我们给大家操作一下,那么这个时候啊,我们就来准备了,把这个给它注掉,做掉以后啊,跟我们之前是一样的呀,同学们,我们之前不是写上它了吗?写个中国号吗?然后呢,写上一个我们的name是吧?OK,我写上一个划括号行了,那我现在什么意思啊,我的这个string我就讲过了,它表述的是数组当中容纳的数据的类型。
09:09
我现在数组当中容纳的就是一个数组啊,所以说把它改成什么,把它改成我们的string中括号。诶,大家看这什么意思,这个不就是我们的宿主吗?那如果它是数组的话,大括号里面再写个大括号,诶然后你再写上什么东西呢?再写上一个张三,然后呢,再写上一个李四,好同学们再写上一个王五。你看我如果这么写的话,语法报错了吗?它标红了吗?没有吧,他如果没有标红的情况下,我们画图怎么画应该就是准确的,所以啊,在Java当中,我们数组中有数组的方式是没有问题的,我们把它称之为叫二维数组。但是啊,这个并不是我们传统意义上的二维数组,传统意义上的二维数组呢,其实是我们的行和列所组成的数据矩阵,也就类似于我们平时所说的表格,大家可以看到,来我们这里准备一下。
10:08
把这个放过来啊,咱们写上一个ID,写上一个name,写上一个年龄,写个1001,写上一个张三,写上一个三四,好复制一下,复制以后大家会发现我当前的这种方式就是我的行和列,它其实就是个表格啊,它要求呢,每一行当中的列必须相同,但是我们Java中的二维数组呢,它只不过是我们数组中的元素是个数组而已,所以啊,它没有列的概念,那么也就无所谓它相不相等了,所以同学们看一下我们这里呀,不是张三李四王五吗?我的第一行里面不有三列吗?对不对?好,我们再来,我们写上一个,他写个大括号,然后呢,我这里面写两个。然后呢,我们这里呢,我们再写一个,这个是完全可以啊,语法上是完全没有任何问题的,所以我们叫二维数组,但是并不是真正的二维啊,这个咱们要理解清楚。
11:01
那么对比我们现在的这个所谓的二维数组的话,咱们之前所讲的这个数组呢,我们就称之为叫一维数组,如果二维数组的元素的话,它也是一个数组,那么就称之为叫三维数组,如果三维数组中的每一个元素也是数组的话,那么就叫四维数组了,以此类推啊,咱们这个维度的概念会有很多很多啊,这个呢,咱们就不再给大家介绍了,哎,老师啊,那咱们Java的二维数组能不能引用行和列表示呢?因为我们表格啊,可能平时会用的比较多一些,对不对?我们的二维数组能不能也是这样呢?其实是可以的,来咱们给大家演示一下。把这个呢,给它注掉啊,来咱们想想它叫标准啊的二维数组,标准的二维数组怎么写呢?很简单,String写两个我们的中国号,这里的我们的两个中括号呢,一个表示行,我们的第一个表示行,我们的第二个表示列,然后呢,你给它写上我们叫做names是吧,我再加个S,它等于什么呢?等于new写个string,你后面呢,也给它写上我们的两个,然后呢,我们写上它叫三,写个三,哎,老师啊,这什么意思,很简单,这么写的话就是三行三列,可能这么看不好理解啊,我们可以简单的把它理解为三乘三个小格子的一个表格啊,这里呢,咱们也画图给大家说一说好了,我们这里呢,我们复制一下啊,复制复制以后呢,咱们往下放啊往下放,然后呢,我们用一个我们的小方块给它包起来,这个呢,就假设呀,是我们当前的一个行了,放过来,放过来以后呢,我这里呢,用绿色呢给它标记一下,然后呢,我们这里呢也复制一下来复制,复制以后呢,同学们,我写上一个零什么意思啊,第一行啊,咱们这里就表。
12:36
我们的第一行啊,第一行,第一行当中有三个小格子,对吧,就有三列了,但是我说过了,我们这里要求呢,它是三行三列啊,这样的话呢,我们就得有一行,那我再拷贝一下,拷贝以后这是我们的第二行,所以写上一,然后那我们再复制一下,复制以后咱们再往下,下面呢是我们的什么,我们的来写上012,我写成一个二,这是我们的三行,三行中每一行有三列嘛,不就这意思吗?但是他们合在一块是一个整体,我们把它称之为叫二维数组,也称之为叫数据矩阵啊。
13:09
好了,放过来,把它放进去,放进去以后这里我们给它标识一个我们的蓝色啊,行了,哎,这样的话其实就可以了,我们这里用文字呢,也说一下吧,咱们这叫二维。啊,我们的速度就可以了啊好了,把它放到这边,哎,老师呀,那我现在呢,我们要给这个小格子一个一个赋值怎么办?哎,没问题啊,只要你把它的行确定好,你把它的列确定好,其实就可以了,来同学们看一下咱们这里呢,Name,然后呢,我们写上一个中括号,再写个中国号,我们写上一个零,写上一个一啊写上他,然后呢,我们写上一个叫张三,哎,老师这什么意思,记住了啊,我说了第一个表示行,第二个表示列,所以你看一下我们是零。一我们等同于在这个位置给了它一个值,咱们叫做张三同学们,这个能不能明白,所以啊,还是我们的索引定位,只不过因为数组里面有数主了嘛,所以它就有两个索引了,不过呢,在咱们这里啊,就是我们所谓的什么我们的行索引和咱们的列索引对不对?哎,这个咱们要区分开就可以了啊,还有个题希望大家注意啊,我们这里的二维数组呢,并不是真正的二维数组,所以说你必须要定义第一个我们红色的索引之后,才能我们定义第二个紫色的缩引,你不能说我第一个不要我直接写成第二个,这不行,大家看一下,你是绝对不允许你把这个零去掉的。
14:27
你去掉以后,老师啊,我想把当前的这个二维数组当中的第二列全给它设定为张三,你这个没有这个能力,对不对,为什么呢?因为我连他都确定不出来,你怎么能确定列呢?是确定不了的,所以我们前面这个行是一定要先确定呢,这个需要大家注意啊,那么既然我赋值可以这么赋值,其实呀,我们获取值也可以采用同样的方式,大家看一下来我们这里写上它,诶来写完了以后,大家看一下,我就写上一个names,写上一个它,然后呢,我写上一个零,我写上一个一,因为我刚才啊,就是往这个位置给它附了个值嘛,所以我现在运行,运行以后,你当前的结果就应该是张三,没有任何的问题,诶老师,那如果我当前取的是一和一呢?
15:09
同学们记住了,你要取的是一和一的话,那我当前的这个地方取的就是它,为什么呢?第我们取的就是我们的第二行,然后呢,我的第二列,它里面啥都没有啊,所以取出来就是空,所以呢,这个跟咱们前面讲的是一样的,它根据类型呢,会有默认值,那比方说什么零啊,0.0啊,什么false呀,什么那啊,诶这个同学们需要稍微的注意一下啊哎,老师呀,那我现在想遍历每条数据,我该怎么遍历呢?其实也是非常简单的,同学们来我们这里啊,就不能用一个循环了,为什么?因为有两成嘛,那么两成的话你就得分别循环了,所以咱们来咱们操作一下,我写上一个for循环,我这个for循环干嘛呢?我们写上一个int,我们的肉诶等于零,然后呢,我们写成肉小于,小于什么东西啊,同学们,我们就小于三嘛,哎,然后写上一个叫做肉加加,这里面的肉呢,就是行的意思,对不对?好,然后呢,我们再循环干嘛呢?因为我每一行有三列嘛,所以我就写成它,我们叫column,诶Co我们叫做列,它等于零。
16:09
然后呢,我们写上它,我们叫做什么呢?我们的这个小于三,因为你有三列嘛,所以呢,我们的列加加就可以了,写完了以后呢,我在这个地方给它来把这个数据呢,给它访问一下,叫names,然后呢,我们写上一个肉,然后再加上一个列就行了。好了,我这么写完了以后,同学们,我们现在运行一下,看结果,运行完以后你会发现我们的第二个张三出来了,诶老师这个看着好像不是很舒服呀,没错,你看着不是很舒服,是因为你每打印一回呢,你就让他换行了,而我们如果在我们每一行之后换行的话,不就可以了吗?所以啊,咱们这样。我把当前的这个啊,不用LN了,把它去掉,去掉以后我在这个地方我们来写上一个LN,就意味着每一行我打印一个回车,每一行我打印回车,这个地方我就不打印回车了,但是呢,我得加加几个空格啊,给它分隔开,对吧?所以同学们我运行一下,运行运行以后看结果,你看我当前的数据不就出来了吗?我们第一行是三列,第二行三列,第三行三列,只不过我刚才把我们的第一行的第二列给它设定了为张三,你看不就是这个意思吗?
17:19
就是我们所谓的二维数组了,好了,同学们,我们二维数组呢,就先介绍到这里。
我来说两句