数组的基本概念
数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合,通过对这些数据进行统一的操作来实现功能。
数组的三种声明方式
在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是java语言中任意的数据类型,包括简单类型和结构类型。“数组名”是用来统一这些相同数据类型的名称,其命名规则和变量的命名规则相同。
数组声明之后,接下来便是要分配数组所需要的内存,这时必须用运算符new,其中“个数”是告诉编译器,所声明的数组要存放多少个元素,所以new运算符是通知编译器根据括号里的个数,在内存中分配一块空间供该数组使用。利用new运算符为数组元素分配内存空间的方式称为动态分配方式。
1.数据类型[] 数组名称 = new 数据类型[长度];
2.数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3};、
3.数据类型[] 数组名称 = {元素1,元素2,元素3};
示范:定义一个int型数组
public class ArrayDemo {
public static void main(String args[]) {
int num[] = new int[5]; //开辟了一个长度为5的数组
num[0] = 1; // 第一个元素
num[1] = 2; // 第二个元素
num[2] = 3; // 第三个元素
num[3] = 4; // 第四个元素
num[4] = 5; // 第五个元素
for(int i = 0; i < num.length; i++) {
System.out.println(num[i]); //通过循环控制索引
}
}
}
- 数组属于引用数据类型,所以在数组使用之前一定要进行实例化操作,如果使用了没有实例化的数组,则会出现NullPointerException异常的信息, 一般对数组进行遍历操作使用for循环
- 在应用中我们通过数组的下标来取得相应的元素,下标默认从0开始。当数组下标超出数组长度时,数组运行时会发生异常。
数组的结构形式
栈内存
在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码中定义一个变量时,java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,java会自动释放掉为该变量所分配的内存空间。
堆内存
堆内存用来存放由new运算符创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。在堆中创建了一个数组或对象后,同时还在栈内存中定义一个特殊的变量。让栈内存中的这个变量的取值等于数组或者对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。
与结构或类中的字段的区别
数组中的所有元素都具有相同类型(这一点和结构或类中的字段不同,它们可以是不同类型)。数组中的元素存储在一个连续性的内存块中,并通过索引来访问(这一点也和结构和类中的字段不同,它们通过名称来访问)。
数组的引用传递
数组属于引用数据类型,自然可以发送引用传递,传递空间:同一块堆内存空间可以被不同的栈内存所指。
示例:
public class kaikeba{
public static void main(String[] args){
int[] a = new null;
int[] temp = null; // 声明对象
a = new int[3]; // 开辟一个数组,长度为3
System.out.println(a.length);
a[0] = 1; // 数组第一个元素
a[1] = 2; // 数组第二个元素
a[2] = 3; // 数组第三个元素
for(int i = 0; i < a.length; i++)
{
//通过循环控制索引下标更改
System.out.println(a[i]);
}
temp = a; // 发生引用传递,不能出现[]
temp[0] = 5;
System.out.println(a[0]);
}
}