java零基础入门-面向对象篇(二) 数组
说在前面的话:其实越是基础的知识,讲起来难度越大,因为越是基础,它就越偏向底层,你看得到的知识就那么多,但是你看不到的地方有大量的你暂时不需要知道的知识,所以只讲简单的,几句话就搞定了。
数组的定义和初始化
数组是一个引用类型,我前面花了一整篇的时间来说引用类型,就是为这个打基础。一个数组里面只能存同一种类型的数据,可以放基本类型,也可以放引用类型。
定义数组: int[] arrTest1 这样就定义了一个数组类型,int 表示你数组里面要放什么类型的元素,[] 表示这是一个数组不是基本数据类型,arrTest1是变量名。其实还有一种定义的写法(int arrTest1[]),但是最好不要用,可读性比较差,记住这一种就行了。
如果定义了一个int类型的数组,在里面放一个浮点类型,就会报错。
数组的静态初始化:我们前面一直都将定义和初始化写在一起了,其实他们是可以分开的,初始化数组的写法有两种方式,上图中的是第一种方法,如果直接用大括号并且指定每个元素的方式初始化,它是不能分开的。还有一种是可以分开的,通过关键字 new 来初始化。
这里注意啦,这个 new 关键字可是非常非常重要的,n-e-w 三个字母组成一个单词,他里面包含的东西可是非常多的。这个后面单独开一篇文章讲清楚。这里先混个眼熟,new关键字干了啥?要堆划分一个空间,用来存引用类型,然后告诉栈里面的变量,“地址给你,指向我就行了”,最后建立了一个栈指向堆的引用。new暂时了解这么多,接下来继续看数组。
数组的动态初始化:前面讲的初始化直接给数组赋值了,但是其实我们使用数组的时候,一般开始是不知道我们要放什么内容进去的,所以一般只会指定一下长度,而不去初始化数组里面的数据,这就是动态初始化。
动态初始化要注意的就是,你指定了长度以后,系统会给你默认赋值,根据你定义的类型,初始化的值不一样,比如int初始化是0,float是0.0,其他的类型各位可以试试。千万不要以为动态初始化只有长度,没有值,系统会自动赋默认值。
这里讲到了数组的用法,数组很重要的一个属性就是length,可以通过这个属性访问到数组的长度。再就是每个元素的访问,变量名后面中括号里面写上下标即可访问,赋值和读取都可以使用这个方式。
下面来看看 foreach 循环
foreach 不需要操作下标,不需要自增变量,只要你给的对象里面有元素,就能给你遍历出来,是不是很方便。但是要注意的是,循环变量是个临时工,你不要指望通过给他赋值去改变原来的数组,那是不可能的,因为在循环过程中,每一次循环会将元素赋值给这个临时工,你对临时工赋值,只是改变了零时工,却没有改变数组本身的元素,你只能获取他,不能改变他。
数组理解到这里就够了,没有什么深奥复杂的东西,其实我写到这里瞌睡都快来了...没有办法,基础知识都这样,下面我们来讲点有趣的东西吧。
多维数组
一维数组用一个括号,多维数组就用多个括号,一旦维度上去了,你去定义这个数组都会很困难,因为结构会越来越复杂。
接下来看看数组在堆里面长什么样,很多同学喜欢看科幻电影,烧脑啊,多维空间啊,酷炫,那我们的多维数组是不是也是这样酷炫呢?
我们的一维数组在堆里面长这样
同学们肯定脑洞大开,那是不是二维数组长这样?
三维就是这样咯?
我只想说,有这个想法的同学们,让你们失望了...其实真正的多维数组是这样的,他就是个障眼法,多维数组其实是用一维数组衍生出来的。毕竟人类还不能正确的理解多维空间,你就不要指望电脑这个傻子了。
首先变量入栈,然后指向一维数组对象,因为数组是引用类型,数组里的元素也是引用类型,所以第一层数组里面的变量的值其实就是指向了另外一个一维数组,然后以此类推。所以多维数组并不是你们想的那样,只是看上去像是多维数组,其实是一维数组引用另一个一维数组实现的多维数组。
数组用的很少,因为他有不能动态扩容等一些缺点,集合类型会有更多更丰富的容器给我们用,多维数组用的更少,其实真正数据量大了,需要做数据分析了,会有更加专业更好用的工具。比如python的numpy,pandas。