与C、C++不同,Java在数组的定义中并不为数组元素分配内存,因此[ ]中不用指出数组中元素的个数,即数组长度,而且对于如上定义的一个数组是不能访问它的任何元素的。必须经过初始化后,才能应用数组的元素。
除了这种定义数组的方式之外,java语言还提供了其他的定义形式,如下所示:
type[ ] arrayName;
对于以上举出的例子,我们也可以这样定义:
int[ ] intArray;
Date[ ] dateArray;
一维数组定义之后,必须经过初始化才可以引用。数组的初始化分为静态初始化和动态初始化两种:
静态初始化:在定义数组的同时对数组元素进行初始化,例如:
int intArray[ ]={1,2,3,4};//定义了一个含有4个
// 元素的int型数组。
动态初始化:使用运算符new为数组分配空间,对于简
单类型的数组,其格式如下:
type arrayName[ ]=new type[arraySize];
type[ ] arrayName=new type[arraySize];
对于复合类型的数组,需要经过两步空间分配。
首先: type arrayName[ ]=new type[arraySize];
然后:arrayName[0]=new type(paramList);
…
arrayName[arraySize-1]=new type(paramList);
例如:
String stringArrar[]; //定义一个String类型的数组
stringArray = new String[3]; //给数组stringArray分配3个应用
//空间,初始化每个引用值为null
stringArray[0]=new String(“how”);
stringArray[1]=new String(“are”);
stringArray[2]=new String(“you”);
当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。元素的引用方式为:
arrayName[index]
index为数组下标,可以是整型常数或表达式,如:arrayName[1], arrayName[i], arrayName[6*i]等。下标是0序的,即从0开始,一直到数组长度减1。
另外,与C、C++中不同,Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度,例如:
intArray.length指明数组intArray的长度。
二维数组的定义方式
type arrayName[ ][ ];
例如:
int intArray[ ][ ];
也可以采用另一种定义方式:
type[ ][ ] arrayName;
与一维数组一样,这时对数组元素也没有分配内存空间,同样要使用运算符new来分配内存,然后才可以访问每个元素。
二维数组的初始化也分为静态和动态两种。
静态初始化:在定义数组的同时为数组分配空间。
int intArray[ ][ ]={{1,2},{2,3},{3,4}};
不必指出数组每一维的大小,系统会根据初始化时给出的初始值的个数自动算出数组每一维的大小。
动态初始化:对高维数组来说,分配内存空间有下面两种方法:
1.直接为每一维分配空间,如:
type arrayName[ ][ ]=new type[arraylength1][arraylength2]
例如:
int a[ ][ ]=new int[2][3];
2.从最高维开始(而且必须从最高维开始),分别为每一维分配空间,如:
String s[ ][ ]=new String[2][ ];
s[0]=new String[2];
s[1]=new String[3];
s[0][0]=new String(“Good”);
s[0][1]=new String(“Luck”);
s[1][0]=new String(“to”);
s[1][1]=new String(“you”);
s[1][2]=new String(“!”);
数组是用来表达一组同类型数据的数据结构
在Java中数组是定长的,数组的大小不会动态变化
数组变量的值是数组对象实例的引用
在java.util包中的Arrays类提供了一些操作数组的方法
在java.util包中的Vector提供了动态变长数组的功能,Vector的容量可以随着需要变化
int binarySearch(type a[], type key)
数组a必须已经排序,否则返回值无意义
当数组a中有重复的值时,该方法返回的值不确定
如果key存在,则返回它在数组a中的位置
如果不存在,则返回它的“-(插入位置-1)”
void fill(type a[], type val)
void fill(type a[], int fromIndx, int toIndex, type val)
包括a[fromIndx],但不包括a[toIndex]
fromIndx== toIndex时,范围是一个空的范围
boolean equals(type a[], type a2[])
两个数组大小相同,并且每一个元素相等
两个null数组是相等的
void sort(type a[])
void sort(type a[], int fromIndx, int toIndex)
void sort(type a[], Comparator c)
void sort(type a[], int fromIndx, int toIndex, Comparator c)
包括a[fromIndx],但不包括a[toIndex]
fromIndx== toIndex时,范围是一个空的范围
排序算法都具有n*log(n)的计算复杂性,效率高
排序算法都保证稳定,即排序算法不会改变相等元素的顺序
对不同类型的数组,算法的实现并不完全相同
可以用自己的Comparator对象声明自定义的顺序
java.lang.System
void arraycopy(Object src, int src_position,Object dst,int dst_position, int length)
范围不能越界
可对任何同类型的数组进行复制
数组复制过程中做严格的类型检查