关于数组的初学习
对于数组的认识:
首先数组,它类似的与我们之前所学习过的一个名词,变量。他们的作用都是在内存中用来存放数据的,而变量只能存放一个数据,但是数组却能存放一组相同类型的数据,那么数组到底是什么呢?
一.数组的定义:
1.数组的定义:数组是一个容器用于存放同一组相同类型的数据。//当然,数组除了能够存放数据,还可以进行访问数组里面的数据。
2.数组的分类:目前我们所学习的数组可以分为一维数组和二维数组。
一维数组:数组中直接存放数据,也就是元素的数组。
二维数组:二维数组里面存放的是一维数组所对应的地址值。
3.数组的初始化:数组具有初始化这一过程。
数组的初始化:数组的初始化指的是,在内存中,为数组容器开辟空间,并将数据储存在容器中的过程。//简单来讲,初始化就是一个过程,就是在内存中整一块地方,把数据放在该空间里面。
数组的初始化分为两种:一种是静态初始化,另一种叫做动态初始化。
静态初始化:一.1.静态初始化的定义格式:
数据类型 [ ] 数组名 = new 数据类型 [ ] { 元素一,元素二,元素三,}
这种定义格式在JAVA语言中经常使用.
数据类型 [ ] 数组名 = new 数据类型 [ ] { 元素一,元素二,元素三,}
这种定义格式在C语言中更加常见.
2.静态初始化的简单定义格式:
数据类型 [ ] 数组名 = {} ;//括号中仍然是上述的元素。
(一维数组的静态初始化,往往在操作有限相同类型的数据时使用。)
当我们储存完这些数据之后,我们还应当学会调用这些数据,对于数组的中数据的调用,我们就不得不聊起,数组中数据的访问了。
二,数组中数据的访问:
首先我们先定义一个数组,这里采用简单定义的格式
int [ ] arr = {111,222,333,444,555};
如果我们想要在控制台中看到这一组数组,我们应当想到将它们打印在控制台中。
我们会想到 : System.out.println(arr);
所有我们利用IDEA或者其他的虚拟机运行此代码
public static void main(){
int [] arr ={11,22,33,44};
System.out.println(arr);
}
最终我们会的到打印的结果:很显然,这并不是我们所期待的结果。但,这其实时一份地址值。//这个我们稍后会解释
那么我们想正确的调用出我们arr这个数组中所储存的数据到底该怎么做呢?
这里我们要引入一个新的概念,索引。
索引:索引是数组容器中的空间编号,编号从0开始,逐个+1增长。
有了这个索引之后我们就可以正确地进行访问数组空间中所储存地数据!
访问的格式为:
数组名 [ 索引(对应元素)];
那么接下来我们进行操作一番
public static void main(String[] args) {
int [] arr = {111,222,333,444};
System.out.println(arr[0]);
}
打印地结果为为什么会出现这种情况呢?这需要我们从数组内存地角度进行分析
首先我们再次回忆一下,先前所学习过地东西:在我们学习方法地时候,增提到过java运行程序时,内存中地变化。
首先java程序地内存分为5个部分,其中我们认识了栈内存,方法区。今天我们再来认识一下堆内存。程序中如果new了新的数据,那么这个数据将会进入堆内存中。
首先我们知道,方法区是字节码文件中加载时进入到地内存,当程序运转后,没有被调运地方法会在方法区进行待命,但主方法会直接进入栈内存中(因此我们称主方法是程序地入口。)然后会按照顺序结构依次运行程序,直到调用到方法时,方法区中地方法才进入栈内存进行运转。这里我们举一个简单地例子进行分析。
当程序开始运转时,首先系统开始读取第一个代码,然后开始数组的初始化这一过程,该过程会在栈内存中开辟出一个新的空间,同时我们知道,数组的完整定义格式中含有new,也就是说当数组在栈内存进行初始化时,同时也在堆内存中产生了一个新的空间,这个空间存放着数组里面的数据,并产生一份地址。(这个地址便是我们没有利用索引访问元素而直接打出来的值)产生完这份地址之后,该地址会放回给栈内存中的arr。所以我们直接打印该数组得到的是一份地址,而并非是数组里面的数据,当我们利用索引之后,便可以直接通过索引来直接找到堆内存中的存放数据的具体位置,并进行利用。
现在,我们已经介绍完了一维数组中的元素访问方式,但是同上上述的访问方式我可以知道,这种访问方式是远远不够。因为他只能访问数组中其中一个数据,当我们要处理数据时,仅仅利用这一个时远远不够的,因此我们还应当学会利用循环去遍历数组。
上面介绍完了静态初始化,接下来开始我们的动态初始化。
数组的动态初始化,可以用处理一些未知数据的一组相同种类的数据。
数组动态初始化的格式:
数据类型 [] 数组名 =new 数据类型 [ ] ;//其中括号中输入的时需要的数组长度
数组动态初始化往往在解决存储数据和未知值同一组相同元素的处理较多,这里使用方法与静态初始化类似。
三,利用循环去遍历数组:
首先我们可以采用for循环来进行遍历数组。其流程如下
public static void main(){
int [] arr = {11,22,33,44,55};
for(int i= 0;i<5;i++){
System,out.println(arr[i])
}
}
通过上述的程序我们可以打印出上述的数组中的所有元素,但这种方法有一个很明显的缺点。是的当这个数组中的元素多难以一眼看出,我们很难进行操作。因此我可以运用数组长度
arr.length;
因此我们仅仅需要将for中的条件判断语句改为i<arr,length即可。在idea中可以直接输入arr.fori来进行书写数组遍历的语句。
上面我们说完了一维数组,接下来开始我们的二维数组。
二维数组与一维数组的具有一定的相似性。
二维数组静态初始化的定义格式:
数据类型 [] [] 数组名 = new int [] [] {{元素1,元素2....},{元素1,元素2.....}}
访问方式也近似相同;
arr[ 索引1] [ 索引2];
其中索引一指的是二维数组中一维数组的编号。索引二指的是,一维数组中对应元素的编号
因此,由上述两个索引来确定二维数组中的元素,我们遍历数组的循环应该,多一次循环
for(int i=0;i<arr[ i].length;i++){
for(int j = 0;j<arr[i].length;j++){
}
}
利用这个方法我们可以得到所有二维数组里面的数据。
通过学习完数组这一个新的容器之后,我之后对同一类型的数据处理,应当多往数组这边寻求答案,例如班级成绩,和评委打分等方面的问题!