基本类型的变量只能存放单个值,而程序经常需要处理若干具有相同类型的数据,如100个学生的某门课成绩。
尽管可以声明用100个变量来分别存放这100个学生的某门课的成绩,但显然这样的方式过于繁琐,此时采用数组将极大的方便编程。
数组是由若干具有相同类型的元素构成的有序集,实际上它是一种用于存放固定个数的数据的容器。
数组中的元素可以是基本类型,也可以是对象类型,但同一数组中的所有元素必须具有相同的类型——如int数组和字符串数组分别表示数组中所有元素是int类型和字符串类型。
数组中元素的总个数称为数组的长度,每个元素在数组中所处的位置称为该元素的下标,通过下标来定位数组中的某个元素。
若能以一个下标定位到数组中的元素,此时的数组称为一维数组。
声明一维数组
数组是一种特殊的变量,因此也需要先声明,一维数组的声明有两种等价的格式为:
类型 [] 数组名; //如int[] a,声明了基本类型的数组a
类型 数组名[]; //如string names[],声明了对象类型的数组names
说明:
- 此处的方括号不代表可选项,而是数组特有的语法,数组名左侧的类型并非指数组的类型,而是指数组中元素的类型,因此,前一种声明方式更能体现数组的实质。
- 不管数组中的元素是何种类型,数组本身是一种对象类型。
- 声明数组时不能在方括号中指定数组的长度,而是在创建数组时指定。
创建一维数组
仅仅声明数组,数组元素并未被分配内存单元,因此,声明数组后要进行创建的操作——为数组元素分配内存单元,否则不能访问该数组,创建一维数组的语法格式为:
数组名 =new 类型[长度];//如a = new int[5]
说明:
-
关键字new右侧的类型必须与声明时指定的类型一致,对于对象类型要兼容。
-
长度不能省略,其可以是任何值为int型的表达式,但不能为负数,若长度是byte,short或char型,则自动提升为int型。
-
可以在声明的同时创建数组,也可以先声明,再单独创建,如:
int [] a = new int [5]; //声明的同时创建数组
float [] b; //先声明
b = new float [10]; //单独创建
-
创建数组后,各元素的值均为默认值(对象类型为null)
从内存角度看,数组名实际上代表着数组对象的引用,被分配在栈中,而数组元素则被分配在堆中。
与其它编程语言一样,java中的数组也占据着一段连续的内存单元,因此数组具有随机存取的特性。
随机存取是顺序存储结构所具有的特性,结构中任一元素的存放位置是计算出来的——结构的起始地址加上元素相对于该起始地址的偏移量,无论要访问的元素的偏移量是多少,cpu执行一条加法指令所耗费的时间都是一样的,因此找到数组中每个元素所耗费的时间也是一样的。
类型[] 数组名 ={初值1,初值2,…};
- 多个初值彼此以逗号隔开,初值的个数决定了数组的长度,花括号中可以没有任何初值此时数组长度为0.
- 系统先根据初值个数建出数组,然后将各初值按顺序赋给各元素。
- 若初值的个数比较多,且具有一定规律,则通常采用循环结构在运行时为各元素赋值。
- 各初值的类型要与声明的类型一致,若不一致,则系统会试图将初值类型自动转换为声明的类型,若不能转换,则视为语法错误。
访问以为数组
1.
取得数组长度
java中的任何数组都有一个标识数组长度的属性——length,可通过“数组名.lenght”的形式动态取得数组的长度。
2.
访问数组元素
数组名[下标]
- 下标可以是任何值为int 型的表达式。
- 尽管下标也位于方括号中,但其与创建数组时方括号中长度的意义完全不同——前者用于访问数组的元素,后者用于创建数组。
- 因java从语法层面取消了指针,故不支持所占的内存地址来访问数组的元素。
- 下标从0开始,第i个元素的下标是i-1,即下标为自然计数之间相差1
增强型for循环
for(类型 e :数组名){
循环体
}
- 会依次取数组中的各个元素并赋值到变量e。
- 元素e的类型要与声明数组时的类型兼容。
- 增强型for循环屏蔽了数组元素的下标,若要在循环体中取得下标,可以在循环外部声明一个初值为0的int型变量,并在循环体结构前将该变量自增1.
- 在可能的情况下,应优先使用增强型而非常规的for循环。