数组
数组是Java中的一种数据类型,是一组数据的集合,数组中的每个成员称为元素。Java中的数组是类类型(引用类型),Java的同一个数组中,只能存放相同类型的数据元素。
一维数组
- 一维数组的定义方式
一维数组有以下两种定义方式,推荐使用第一种定义方式<数据类型>[] <数组名称>;
<数据类型> <数组名称>[];
在没有初始化时,定义数组是不能指定长度!也就是说数组不能使用。int[4] array;//错误
其中<数据类型>决定这该数组中元素类型(数组名称[0]所表示的元素类型)。所以<数据类型>不仅可以代表基本数据类型,还可以代表类类型(引用类型)。
Java程序在定义数组时并不为数组元素分配内存空间,只为<数组名>提供一个引用空间(实际上就是指针)。 - 用new关键字动态初始化创建一维数组对象(前提是<数组名称已经被定义为元素类型>)
<数组名称> = new <数组元素类型>[整型常量];
在这个过程中,使用new关键字来产生数组的实例对象。
这样实例化以后,就可以用 <数组名称>.length得到数组的长度属性。
[整形常量]是数组元素的长度,下标由0开始到[整形常量-1。]在堆空间中申请一个大小为数组元素类型(定义数组时的数据类型)乘以整形常量(数组元素占用内存空间乘以数组元素个数)的内存空间。并且对堆空间空间中的所有元素默认初始化(对整形变量置0、浮点变量置0.0、boolean类型变量置false、并对类类型的变量置null(字符串变量置null))。
这里以如下代码为例
int[] array[4] = new int[4];
array的类型是一个指向类型为int的堆空间的指针
array的值是堆空间数组元素首地址的地址值。
array数组的四个元素值均为0
- 一维数组初始化
一般定义时直接初始化。
未使用new关键字静态初始化(其中包括了定义过程)建议使用第一种。<数据类型>[] <数组名称> = {<数组元素数据类型的值>, <数组元素数据类型的值>, ……};
<数据类型> <数组名称>[] = {<数组元素数据类型的值>, <数组元素数据类型的值>, ……};
静态初始化实际上默认使用了new关键字,只不过数组长度和数组元素值已经被{}中的数据所确定。
Java编译程序会将初始化中{}内的数据个数作为数组的元素个数。
int[] a = new int[3];
int[] b =a;
这里的数组b定义后初始化为a数组所指向的空间,也代表了数组a的length属性。b可以引用并改变a的数组元素。
int[] a;
a = new int[] {<数组元素数据类型的值>, <数组元素数据类型的值>, ……};
用这种方式定义和初始化数组,数组元素个数由<数组元素数据类型的值>的个数确定。元素值分别为<数组元素数据类型的值>所确定。注意这里的int[]为类型定义,[]内不能写数字。
二维数组
Java中的二维数组实际上可以看作是二维数组的每个一维元素是一维数组。
- 二维数组的定义及其动态初始化方式(推荐使用第一种,更加明确数组类型)
<类型>[][] <数组名称> = new <类型>[<二维数组列个数>][<二维数组行个数>];
<类型> <数组名称>[][] = new <类型>[<二维数组列个数>][<二维数组行个数>];
这种方式会在堆内存空间中,申请数组元素空间并对其默认初始化(类类型置null、整形置0、浮点置0.0、boolean置false)。
- 二维数组定义及其静态初始化(推荐使用第一种)
<类型>[][] <数组名称> = {{<该类型常量>, <该类型常量>}, {<该类型常量>}};
<类型> <数组名称>[][] = {{<该类型常量>, <该类型常量>}, {<该类型常量>}};
以此为例,该二维数组<数组名称>[0]中有两个元素,<数组名称>[1]有一个元素。每个一维形式的数组的元素值和个数根据{}内中的元素值和个数确定。
- 数组元素的访问方式
数组的每个都有一个索引(下标),数组中的第一个元素的索引是0,最后一个元素的索引是数组元素个数-1,依次递增一。
二维数组的最后一个元素<二维数组名称>[<二维数组名.length - 1>][<二维数组名[二维数组名.length - 1].length - 1>]
数组的length属性表示数组元素个数,它被声明为public int length;
length属性被public和final联合修饰,所以程序中可以获得数组长度,但不能修改数组长度。
- 传参的方式(参数的传递方式)
参数传递涉及实际参数和形式参数。
实际参数:当方法实行时,方法实际上所使用的参数。
形式参数:调用方法时用到的内部变量名称。定义方法时所用的参数。
实际参数的类型必须和定义时的形式参数的类型保持一致(实际上在涉及类类型中的继承关系时,可以用子类类型的对象作为实参来调用形参类型的父类对象)。当含有多个形参时,实参形参类型顺序必须一一对应。
参数在传递中实际上只有一种方式,就是值传递。所谓的地址传递,实际上是指指针的值,也是值传递的方式。
Java程序中调用含有参数的方法时,当方法形式参数是基本数据类型时,将该基本数据类型变量或者表达式或者常量的值复制的结果,所以该方法{}内对实参的赋值不影响调用方法时作为实参的变量或者表达式的值。(常量不存在被赋值的操作) - Arrays类
Java程序中的工具包,将工具包内的构造方法私有话,这样就保护了工具,所以不能用new Arrays();而直接用Arrays.<方法名称>;来实现Arrays类中所提供的相关逻辑处理。
数组的使用为Java程序提供了较高效率的存储和访问数据的一种方式,然而要解决一般化的问题我们仅仅使用数组就不能高效地完成(例如排序等操作)。
Arrays类属于java.util包,其中包含了一套static方法,提供操作数组地使用功能,可以对Java数组进行数据查找、排序等功能。
对于数类型的数组,一般存在如下基本操作
方法名称 | 逻辑功能 |
sort() | 对指定数组进行排序 |
binarySearch() | 对已排序数组进行二元搜索,如果找到指定值就返回该值所在的索引(下标),未找到就返回负值 |
fill() | 将数组中的所有元素设定为指定值 |
equals() | 比较两个数组的数组元素类型和值是否完全一致返回值为boolean |
用Arrays.<方法名>(<数组名>);等方式来使用工具类中提供的方法。