学习到数组就开始慢慢接触数据结构与算法相关的知识了,下面将逐步的介绍Java中的数组。
1.数组的定义
Java里面对于数组的定义是这样的: 类型名[] 数组变量名; 或者 类型名 数组变量名[]; 这里中括号的数量就代表了数组的维数,下面直到二维数组都将以一维的数组做为示例。从上面的定义可以看到,中括号放在类型名或者变量名后面都是可以的,但是建议还是放在类型名后面,以表示后面的变量是一个数组类型的变量。
2.数组的空间分配
我们都知道Java里面出来基本数据类型以外,其它类型都是引用类型,所以数组在定义以后还需要通过关键字new来分配空间,有一点需要牢记,数组的长度是固定的,在程序运行过程中如果访问超过其下标的位置将出现越界异常。数组空间的分配有两种方式:
a>type[] arrayName = new type[]{item0, item1, item2, item3}; // 这里再分配时就赋给了初值,但没有显式的给出数组长度
b> type[] arrayName = new type[num]; //这里num是一个常整数或整数表达式。 这里显式的给出了数组长度
按照上面两种方法为数组分配了空间以后,数组的长度在其生命周期内将一直保持不变,访问操作时也不可超出其范围。
3.数组的初始化
数组在被定义并分配了空间以后,还要记得对其进行初始化,上面的a>方法在分配空间的同时已经被赋了初值,而b>方法则没有,可以通过for循环遍历数组对其进行初始化。提示:数组的空间分配与初始化一般都是一起进行的,对应上面两种方式,Java语言中称为数组的静态初始化与动态初始化。
a>静态初始化:由程序员给定数组中每个元素的值,数组的长度由系统决定,就如上面的a>方式。
b>动态初始化:由程序猿给定数组的长度,初始化由系统自动进行(类的成员变量)或由程序员在代码中显式进行(使用for循环),就如上面的b>方式。
通过for循环初始化的示例代码如下:
for(int i = 0; i < arrayName.length; i++){
arrayName[i] = 0; // 这里数组是数据类型的。
}
为什么要进行初始化呢?后面接触到类时会提到成员变量与局部变量的概念,到时候在回过来想想就知道了,现在记住一定要进行初始化就行。
4.数组的使用
经过上面三个步骤以后,我们的数组已经完全准备好,可以被使用了。对数组的使用直接通过下标访问即可,具体方法为:arrayName[index]; //注意这里的index取值范围为[0, arrayName.length)(小技巧: 这种取值范围在编程语言中经常出现,回想一下前面字符串中的内容,是否也有类似的取值范围)。
下面通过一个示例来看一下上面提到的四个步骤。
int ary[]; // 定义一个int类型的数组
ary = new int[4]; // 为数组分配了长度为4的空间
for(int i = 0; i < ary.length; i++){ // 通过for循环对数组进行初始化。这里我们虽然知道长度为4,但还是调用数组的length属性,这是个好习惯。
ary[i] = 0;
System.out.print(ary[i] + " "); //打印出初始化后的数组值
}
System.out.println();
ary[3] = 10; // 对下标为3的数组元素进行修改,这里需要注意,因为数组长度为4,所以数组下标的取值范围为[0,4)<--永远记住这种格式。
for(int i = 0; i < ary.length; i++){ // 打印出修改后的数组值
System.out.print(ary[i] + " ");
}
运行上面的一段程序后,观察控制台输出结果,思考一下数组的定义及使用。下面将进一步挖掘数组的应用。
*****************************************************************************************************************************************************************************************
5.使用Java的工具类——Arrays来操作数组
Arrays工具类定义了一系列的static方法来操作数组,灵活的使用这些工具将使得编程更为轻松,下面列出几个常用的工具类,具体还请查看JDK.
对数组ary的数据进行升序排序。—— 注意这里只是进行升序排序。思考一下如果要实现得到降序的结果,该如何去获得?void sort(type[] ary);
对数组ary中的fromIndex与toIndex之间的数据进行升序排序。注意这里的范围[fromIndex, toIndex) <--还是这种格式。void sort(type[] ary, int fromIndex, int toIndex);
使用二分查找法查找数组中出现key值得元素索引,如果数组中不存在key值,则返回负数。 注意这里的数组必须是经过升序或降序排序的,否则将无法得到正确的结果。int binarySearch(type[] ary, type key);
使用二分查找法在数组[fromIndex, toIndex)范围内查找与key值相等的元素索引,如果没有则返回负数。int binarySearch(type[] ary, int formIndex, int toIndex, type key);
使用指定的val值赋值数组的每个元素。 —— 这个方法可以方便的用来进行初始化。void fill(type[] ary, type val);
同上面的sort语法类似,这个方法就是就是将[fromIndex, toIndex)区间内的数组值赋值为val。void fill(type[] ary, int fromIndex, int toIndex, type val);
int ary[][]; // 二维数组的定义。 也可以使用后面两种方法,但建议使用这种:int[] ary[];或 int ary[][];
ary = new int[4][]; //空间的分配。可以只指定高维的长度,也可以指定所有维数的长度如 ary = new int[4][4];
for(int i = 0; i < ary.length; i++){ // 初始化
ary[i] = new int[i+ 1]; //这里注意,因为前面为高维分配了空间,所以这里必须为低维进行空间分配
for(int j = 0; j < ary[i].length; j++){ // 为每一个元素进行初始化
ary[i][j] = 1;
System.out.print(ary[i][j] + " ");
}
System.out.println();
}
System.out.println("**************************************");
ary[3][3] = 10; // 通过下标修改某个具体的数组元素
for(int i = 0; i < ary.length; i++){
for(int j = 0; j < ary[i].length; j++){
System.out.print(ary[i][j] + " ");
}
System.out.println();
System.out.print(ary[i] + " "); // 如果只是用一个高维度,则返回的是低维每个数组的引用地址。
}
关于数组就讲这么多。数组做为常用的一种数据结构,在编程中大量使用,不过一般只用在一些小型数据场所。对于复杂的操作一般都使用一些其他的集合类,后面也会介绍到一些。