Java学习笔记——数组

        学习到数组就开始慢慢接触数据结构与算法相关的知识了,下面将逐步的介绍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.

  • void sort(type[] ary);
    对数组ary的数据进行升序排序。—— 注意这里只是进行升序排序。思考一下如果要实现得到降序的结果,该如何去获得?
  • void sort(type[] ary, int fromIndex, int toIndex);
    对数组ary中的fromIndex与toIndex之间的数据进行升序排序。注意这里的范围[fromIndex, toIndex) <--还是这种格式。
  • int binarySearch(type[] ary, type key);
    使用二分查找法查找数组中出现key值得元素索引,如果数组中不存在key值,则返回负数。 注意这里的数组必须是经过升序或降序排序的,否则将无法得到正确的结果。 
  • int binarySearch(type[] ary, int formIndex, int toIndex, type key);
    使用二分查找法在数组[fromIndex, toIndex)范围内查找与key值相等的元素索引,如果没有则返回负数。
  • void fill(type[] ary, type val);
    使用指定的val值赋值数组的每个元素。 —— 这个方法可以方便的用来进行初始化。
  • void fill(type[] ary, int fromIndex, int toIndex, type val);
    同上面的sort语法类似,这个方法就是就是将[fromIndex, toIndex)区间内的数组值赋值为val。
6.数组在内存中的引用
        Java中除了基本数据类型外,其它都是引用类型,数组也不例外。我们在定义了数组并分配空间以后,数组的具体数据时保存在内存中堆的某处,而数组变量本身的引用是保存在内存中栈的某处。那么当数组不再使用时,我们将数组的引用变量赋值为null,即可断开它与堆中数组的联系,从而利用系统的垃圾回收机制收回堆中的内存。

7.最后再看一下二维数组
        二维数组经常被用在表述二维空间或矩阵等具有面特性的对象,它的声明方式跟一维数组差不多,只不过是多了一个中括号而已。下面通过一个例子来看一下二维数组的定义、空间分配、初始化及使用。
		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] + " "); // 如果只是用一个高维度,则返回的是低维每个数组的引用地址。
		}

        关于数组就讲这么多。数组做为常用的一种数据结构,在编程中大量使用,不过一般只用在一些小型数据场所。对于复杂的操作一般都使用一些其他的集合类,后面也会介绍到一些。
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值