java语言入门之数组

数组的简介
数组是应用最广泛的数据结构,典型的数组是用来集合相同类型的对象并通过一个名称来引用这个集合。它被植入到了大部分编程语言中。在Java编程语言中,数组是一个对象。
数组的使用分三步:
1:声明数组 ;
2:创建数组 ;
3:初始化数组。

数组的声明
声明不能创建对象本身,而创建的是一个引用,该引用可被用来引用数组。
char s[];
Point p[]; // where point is a class

上述这种将方括号置于变量名之后的声明数组的格式,是用于C、C++和Java编程语言的标准格式。这种格式会使声明的格式复杂难懂,因而,Java编程语言允许一种替代的格式,该格式中的方括号位于变量名的左边:
char[] s;
Point[] p;

这样的结果是,你可以认为类型部分在左,而变量名在右。上述两种格式并存,你可选择一种你习惯的方式。声明不指出数组的实际大小。

NOTE:当数组声明的方括号在左边时,该方括号可应用于所有位于其右的变量

创建数组
你可以象创建对象一样,使用关键字new 创建一个数组。
s = new char[20];
p = new Point[100];
第一行创建了一个20个char值的数组,第二行创建了一个100个类型Point的变量。然而,它并不创建100个Point对象;创建100个对象的工作必须分别完成如下:
p[0] = new Point();
p[1] = new Point();

用来指示单个数组元素的下标必须总是从0开始,并保持在合法范围之内--大于0或等于0并小于数组长度。任何访问在上述界限之外的数组元素的企图都会引起运行时出错。下面还要谈到一些更好的数组初始化方法。

初始化数组
当创建一个数组时,每个元素都被初始化。在上述char数组s的例子中,每个值都被初始化为0 (\u0000-null)字符;在数组p的例子中, 每个值都被初始化为null,表明它还未引用一个Point对象。在经过赋值 p[0] = new Point()之后,数组的第一个元素引用为实际Point对象。

NOTE:所有变量的初始化(包括数组元素)是保证系统安全的基础,变量绝不能在未初始化状态使用。

Java编程语言允许使用下列形式快速创建数组:
String names [] = {
“Georgianna”,
“Jen”,
“Simon”,
};

其结果与下列代码等同:
String names [] ;
names = new String [3];
names [0] = “Georgianna”;
names [1] = “Jen”;
names [2] = “Simon”;

这种”速记”法可用在任何元素类型。例如:
Myclass array [] = {
new Myclass (),
new Myclass (),
new Myclass ()
};
适当的类类型的常数值也可被使用:
Color palette [] = {
color.blue,
color.red,
color.white
};

多维数组
Java编程语言没有象其它语言那样提供多维数组。因为一个数组可被声明为具有任何基础类型,所以你可以创建数组的数组(和数组的数组的数组,等等)。一个二维数组如下例所示:
int twoDim [][] = new int [4][];
twoDim[0] = new int[5];
twoDim[1] = new int[5];

首次调用new而创建的对象是一个数组,它包含4个元素,每个元素对类型array of int的元素都是一个null引用并且必须将数组的每个点分别初始化。

NOTE:尽管声明的格式允许方括号在变量名左边或者右边,但此种灵活性不适用于数组句法的其它方面。例如: new int [][4]是非法的。因为这种对每个元素的分别初始化,所以有可能创建非矩形数组的数组。也就是说,twoDim的元素可按如下方式初始化:
twoDim[0] = new int [2]
twoDim[1] = new int [4];
twoDim[2] = new int [6];
twoDim[3] = new int [8];
由于此种初始化的方法烦琐乏味,而且矩形数组的数组是最通用的形式,因而产生了一种”速记”方法来创建二维数组。例如:
int twoDim [][] = new int [4][5];
可被用来创建一个每个数组有5个整数类型的4个数组的数组。

数组界限
在Java编程语言中,所有数组的下标都从0开始。 一个数组中元素的数量被作为具有length属性的部分数组对象而存储; 这个值被用来检查所有运行时访问的界限。如果发生了一个越出界限的访问,那么运行时的报错也就出现了。
使用length属性的例子如下:
int list [] = new int [10];
for (int i= 0; i< list.length; i++) System.out.println(list[i]); 使用length属性使得程序的维护变得更简单。 拷贝数组
数组一旦创建后,其大小不可调整。然而,你可使用相同的引用变量来引用一个全新的数组:
int myArray [] = new int [6];
myArray = new int [10];

在这种情况下,第一个数组被有效地丢失,除非对它的其它引用保留在其它地方。

Java编程语言在System类中提供了一种特殊方法拷贝数组,该方法被称作arraycopy()。

函数原型:public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

使用如下:
// original array
int myArray[] = { 1, 2, 3, 4, 5, 6 };

// new larger array
int hold[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
// copy all of the myArray array to the hold
// array, starting with the 0th index
System.arraycopy(myArray, 0, hold, 0,myArray.length);

于是,数组hold有如下内容:1,2,3,4,5,6,4,3,2,1。

这个函数可以实现自己到自己复制,比如:

int[] fun ={0,1,2,3,4,5,6};

System.arraycopy(fun,0,fun,3,3);

则结果为:{0,1,2,0,1,2,6};

实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fu)。

NOTE:
(1)在处理对象数组时,System.arraycopy()拷贝的是引用,而不是对象。对象本身不改变。
(2)src and dest都必须是同类型或者可以进行转换类型的数组。

此条目发表在java/j2ee分类目录,贴了标签。将固定链接加入收藏夹。