什么是数组
在执行程序的过程中,经常要存储大量相同类型的数据。
如:要读入100个数,计算平均值,然后找出有多少个数大于平均值。
(1)程序读入这些数并计算它们的平均值
(2)将每个数与平均值进行比较判断它是否大于平均值。
为了完成任务,必须将全部数据存储到变量中。声明100个变量,重复写书100次几乎完全相同的代码,这个方式是不现实。
Java和其他编程语言一样提供了数组来存储这些数据。
数组是一组具有相同类型和名称的变变量的有序集合。
组成数组的这些变量称为数组的元素素,一个数组可以含有若干个元素。下标也叫索引(Index),用来指出某个元素在数组中的位置。
数组中第一个元素的下标默认为0,第二个元素的下标为1,依次类推。如果某一数组有n个元素,则其最大下标为n-1。
一维数组的定义与使用
一维数组的定义
引例:在线性代数中,具有10 个整数元素的行矩阵A的表示方法为A=[ao a¡ a2 a3 … a9]。为了存放行矩阵A的元素值,引入一维整型数组a[10],该数组组名为a,共有10元素,分别为a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。
同其他数据类型一样,数组必须先定义后使用,下面逐一介绍一维数组的定义、初始化引用方法。
1.一维数组的声明
数据类型[]数组名;
或 数据类型数组名[];
说明:
①“数据类型”定义了数组元素的数据类型,可!以是基本数据类型或引用数据类型。
②“数组名”定义数组变量的名字,应符合标识符的命名规则。
③ 声明数组时,不能在方括号中指定数组的元素素个数。
例如int[]a;或inta[];是正确的数组声明方式; int[10]a是错误的数组声明方式。
以上两种正确的数组声明方式均可声明一个数组 a,并且规定数组a中的元素类型均为整型。但在数组定义时并没有给出数组长度,系统没有为数组元素分配存储空间,此时若为数组元素赋值,
例如:
a[0]=1
编译器会给出局部变量未初始化的错误提示信息
所以,在数组声明后,需要创建数组,为数组分配存储空间。
2.一维数组的创建
可使用new关键字创建数组并分配存储空间,格式如下:
数组名=new数据类型[数组长度];
这时,系统会创建数组并为数组分配存储空间,且数组中的每个元素会被自动赋一个默认值,如整型为0,实型为0.0,布尔型为false,字符型为'\u0000'。如:
该语句为数组分配能容纳5个整型数据的内存容量,且数组中每个元素的初始值都为0。
上述例子是先声明数组变量,再用new关键字创建数组并分配内存,在实际操作中,数组的声明与创建也可以合二为一,用一条语句表示,格式为:
数据类型[]数组名 =new数据类型[数组长度]; 或
数据类型数组名[ =new数据类型[数组长度];
例如:
除了使用new关键字创建数组外,还可以利用初始化方式声明数组变量并创建数组对象,其格式如下:
数据类型[]数组名=(值1,值2,.);
例如:
上述语句未使用new关键字,也未指定数组长度,由初始化元素的个数创建数组并确定数组长度。
一维数组的初始化及内存分配
1.一维数组的初始化
数组可以和基本数据类型一样,在定义的同时进行初始化操作。数组的初始化操作分为静态初始化和动态初始化两种形式。
(1)静态初始化
静态初始化是指在创建数组的同时给数组赋值。例如:
(2)动态初始化
动态初始化是指在创建数组后给数组元素赋值。例如:
2.一维数组内存分配
在Java语言中,基本数据类型变量的数据是直接保存在栈(stack)中的,引用数据类型变量在栈中保存了一个指针,而将实际数据保存在堆(heap)中,栈中的指针指向堆中的数据。当声明一个一维数组时,在栈中生成一个与该数组名相同的引用变量(指针)。例如
在栈中生成一个名为a的引用变量,这时还未生成任何实际的数组,所以堆中没有任何相应的信息(见图a)。然后用new关键字创建数组:
这时,new 关键字生成了一个数组,这个数组是在堆中的,共有3个元素(见图b)。引用变量的指针指向这个数组。直到这时,数组才是可以被访问的:
代码运行的结果是为数组赋值(见图c)。
一旦这个数组不再需要,Java就自动释放它所占用的内存。
3.一维数组的引用
为数组分配了空间以后,就可以访问数组中的每一个元素了,数组引用的格式为:数组名[数组下标]
其中,数组下标可以为整型常量或表达式,如a[2]、a[i]、a[i+1]等,它的值从0开始,例如前面定义的数组a:int[] a=new int[3];
数组下标从0到2,如果调用了a[3],程序会出现数组下标越界错误提示信息:
java.lang.ArrayIndexOutOfBoundsException
例1:某小组有10个学生,进行了数学考试, 求他们数学成绩的平均分、最高分和最
低分。
运行结果:
例2:将一个数组的内容按颠倒的次序重新存放。例如数组中原数组元素的值依次为:
8、3、5、1、9、7、2,要求改为:2、7、9、1、5、3、8。
运行结果:
4.数组在内存中的存储
数组是引用类型
数组名变量在栈内存中,变量中存放的是数组元素的起始地址(引用)
数组元素存储在堆内存中
若数组没有初始化(实例化),系统没有给数组元素分配存储空间,数组名的初值为null