数组(Array)是在内存中连续存储的具有相同类型的一组数据的集合。
数组是一组相同类型元素的集合。
数组中,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。
注意:
1,数组的下标从0开始(包括0)连续计算。
2,数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
3,数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。
4,数组中的所有元素都具有相同类型。
5,必须明确Java数组不是Java的8个基本数据类型之一,Java数组属于Java的引用类型。
6,数组不是集合,它只能保存同类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。
Java程序中的数组必须先进行初始化才可以使用,所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值;而在Java中,数组是静态的,数组一旦初始化,长度便已经确定,不能再随意更改。
符合Java运行规范和Java程序猿习惯的就是以下两种初始化方式。
//动态初始化
数据类型[] 数组名称 = new 数据类型[] {
初始化数据};
//静态初始化
数据类型[] 数组名称 = {
初始化数据};
动态初始化, 初始化时由程序猿确定数组的长度,可以没一个数组元素的值,此时由系统来分配初始值;也可以在初始化时直接定义数组中的初始化数据。
方法1,直接初始化数组数据:
int[] arr1 =new int[] {
1,2,3,4,5};
方法2,先定义数组,再初始化数组中的数据:
int[] arr2 = new int[5];
arr2 = new int[]{
1,2,3,4,5};
下面这种初始化数组数据也可以:
int[] arr2 = new int[5];
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
arr2[3] = 4;
arr2[4] = 5;
注意:
1,**创建数组时,将元素初始化,数组大小根据元素个数确定。**如果不知道其长度,Java不能为其分配内存空间,Array initializer expected
,将会产生错误Error: java: 缺少数组维
。
2,如果此时new
数据类型时{}里已经初始化了数据,那么new 数据类型后面的[]里不需要也不允许再自己写长度。因为Java可以由后面初始化数据的长度自己推导出需要向数组分配多大的内存空间。
3,相反的,如果此时是用方法2初始化数据,那么new
数据类型后面的[]里必须填写需要的数组长度。因为Java数组初始化时必须分配空间,要是创建数组时既没有初始化数据,也没有定义长度,那么Java不能为此分配空间,产生错误。
4,如果只是声明了数组,并没有初始化数组中的数据,则数组中数据为数据类型的默认值。
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
字符型 | \u0000 |
boolean | false |
引用类型型 | null |
静态初始化,由程序猿自己确定每个数组元素的初始值,而数组的长度则由系统自己决定。
int[] arr3 = {
1,2,3,4,5};
静态初始化了数组整型数组arr3,赋予其固定的长度,系统可以为其分配空间。
但是静态初始化不可以再次对数组名称赋值。
int[] arr3 = {
1,2,3,4,5};
arr3 = {
2,3,4,5,6};//再次对静态数组arr3赋值,会产生错误。 这个语句并不适用于赋值语法。
静态和动态初始化也可以分别写成
int arr1[] =new int[] {
1,2,3,4,5};
int arr3[] = {
1,2,3,4,5};
这种写法也是正确的,这种方式是C++的写法,不推荐使用这种。
上面的Java数组写法符合Sun的命名规范,而且容易了解到关键点,这是一个int数组对象,而不是一个int原始类型。
数组的使用最重要的是数组长度的获取、访问数组中的元素和遍历数组。其中要用到解引用操作符 . 和 [ ]。
获取数组长度要用到length
函数,遍历数组要用到for
或foreach
循环。
//获取数组长度
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
System.out.println("数组arr1的长度为:" + arr1.length);//执行结果:数组arr1的长度为:5
//访问数组中的元素
System.out.println(arr1[0]);//输出数组arr1中的第一个元素 //执行结果:1
System.out.println(arr1[1]);//输出数组arr1中的第二个元素 //执行结果:2
arr1[3] = 9;
System.out.println(arr1[3]);//输出数组arr1中的第三个元素 //执行结果:9
[ ]可以用来访问数组中的元素,也可以对数组元素重新赋值。
但是数组在使用时也要谨防下标越界访问。
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
System.out.println(arr1[7]);;//arr1中数组长度为5,并没有第8个元素
//arr1中只能从arr1[0]访问到arr[4]
运行结果:此时会抛出数组越界异常:java.lang.ArrayIndexOutOfBoundsException
,使用数组时一定要谨防下标越界异常。
遍历数组:所谓“遍历”是指将数组中的元素都访问一遍,不重不漏。通常需要搭配循环语句。
使用for
循环
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
for (int i = 0; i < 5; i++) {
System.out.print(arr1[i] + " ");//执行结果:1 2 3 4 5
}
for
循环的好处是可以自己指定遍历范围和更新语句。
使用foreach
循环
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
for (int a:arr1) {
System.out.print(a + " ");//执行结果:1 2 3 4 5
}
foreach
是for
循环的另外一种方式,能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错。
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
System.out.println(arr1);//执行如果:[I@1540e19d
这样直接打印的是arr1的内存地址,如果想要快速高效、更为理想的打印数组中的全部元素可以使用java.util
包下面的Arrays.toString()
方法。
代码示例:Arrays.toString()方法
import java.util.Arrays;//导入即将要使用的包,这一步非常重要,不可省略
public class test {
public static void main(String[] args) {
int[] arr1 =new int[] {
1,2,3,4,5};//整型数组arr1的长度为5
System.out.println(Arrays.toString(arr1));//执行结果:[1, 2, 3, 4, 5]
}
}
·数组的定义和使用不单单可以用示例中的int类型数组,任何基本数据类型也是同样的使用效果。