之前提到的数据类型,java的数据类型分为基本和引用数类型,那么实际上数组就属于引用数据类型,所以,在这里,就首先来观察一下到底什么叫做引用。
1、基本概念
例如:要定义100个整形变量,按照最原始的方式i1、i2、......i100,这样做的话肯定不好管理,所以,这个时候就可以使用数组完成操作了,数据是一组相关的变量集合。
在java中,可以使用如下的语法格式定义一个数组:
数据类型 数组名称[] = new 数据类型[长度];
其中,也可以将以上的语法,变为以下的形式:
数据类型[] 数组名称 = new 数据类型[长度];
只是,个人已经习惯于第一种写法,所以采用那种法师由个人决定。
范例:定义一个整形数组
public class ArrayDemo01
{
public static void main(String args[])
{
int temp[] = new int[10]; //表示声明了10个数组大小
}
}
此时,数组已经声明完毕,那么下面就可以使用数组,使用的形式如下:
1)通过“数组名称[下标]”的形式进行访问
2)在进行访问的时候,一定要注意的是,数组下标从0开始,10个大小的数字,下标:0-9
范例:访问数组中第一个、第三个元素
public class ArrayDemo01
{
public static void main(String args[])
{
int temp[] = new int[10]; //表示声明了10个数组大小
System.out.println("第一个元素:" + temp[0]);
System.out.println("第三个元素:" + temp[2]);
}
}
因为现在的都是整形数据,那么其默认的数值都是0,但是在进行要注意数组操作的时候,一定要注意,数组的下标绝对不能超过数组的界限,如果超过规定的界限之后,将出现以下的错误:
ArrayIndexOutOfBoundeException
另外,在数组的操作中,为了方便起见,可以通过“数组length”取得一个数组的长度。
public class ArrayDemo02
{
public static void main(String args[])
{
int temp[] = new int [10]; //表示声明了10个数组大小
System.out.println("数组长度:" +temp length);
for (int x=0; x<temp.length;x++)
{
System.out.println("temp["+x+"] = " +temp[x]");
}
}
}
以上所进行的数组操作中,因为使用了关键字"new",所以在数组使用的时候已经为其开辟好了新的空间。
数组的使用分为两个部分:
1)声明数组,声明数组的时候一般都是栈内存中声明的
2)为数组开辟空间,使用关键字new进行空间的开辟,在栈内存中声明
数组的使用分为两个步骤:
1)声明一个数组:数据类型 数组名称[] = null; //因为数组是引用数据类型,引用的默认值都是null。
2)开辟数组:数组名称 = new 数据类型[长度]; //使用关键字new完成
public class ArrayDemo03
{
public static void main(String args[])
{
int temp[] = null; //声明一个数组,但是没有开辟空间
temp = new int [10]; //开辟了10个大小的空间
System.out.println("数组长度:" +temp length);
for (int x=0; x<temp.length;x++)
{
System.out.println("temp["+x+"] = " +temp[x]");
}
}
}
数组声明的时候,所有的内容都是默认值0,下面想可以声明一个3个元素的数组,之后为数组里的每一个元素设置的内容都是奇数,并通过此程序,观察内存的分配操作。
public class ArrayDemo04
{
public static void main(String args[])
{
int x [] = null; //声明数组
x = new int[3]; //开辟3个大小的空间
for (int i =0; i<x.length;i++)
{
x[i] = i*2 + 1; //设置奇数
}
for ( int i =0;i<x.length;i++)
{
System.out.println("x["+ i +"] - " +x[i]);
}
}
}
虽然,现在操作的是数组名称,但是实际上改变的即使对内存中的内容。所以,这样的操作在java中就成为引用数据类型。
如果,现在假设把栈内存空间保存的内容当作一个人的名字,那么堆内存实际上就表示具体的一个人,也就是说实际上在栈中存放的只是一个标记而已。
所以,此时,可以为一个堆内存空间同时设置多个栈的引用。
public class ArrayDemo05
{
public static void main(String args[])
{
int x [] = null; //声明数组
x = new int[3]; //开辟3个大小的空间
for (int i =0; i<x.length;i++)
{
x[i] = i*2 + 1; //设置奇数
}
int y [] = x; //将x数组的空间给y数组
for ( int i =0;i<x.length;i++)
{
System.out.println("x["+ i +"] - " +x[i]);
}
}
}
之后,由数组y修改堆空间的内容。
public class ArrayDemo06
{
public static void main(String args[])
{
int x [] = null; //声明数组
x = new int[3]; //开辟3个大小的空间
for (int i =0; i<x.length;i++)
{
x[i] = i*2 + 1; //设置奇数
}
int y [] = x; //将x数组的空间给y数组
y [2] = 300;
for ( int i =0;i<x.length;i++)
{
System.out.println("x["+ i +"] - " +x[i]);
}
}
}
输出的时候,发现现在输出的是x,但是x[2]的内容已经改变了。因为x和y指向了同一个空间。那么这样的操作就表示引用数据类型的操作,也可以成为引用传递。