java数组[编辑]
Java数组的简介
数组是编程语言中最常见的一种数据结构,可以用于存储多个数据,每个数组元素存放一个数据,通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
java语言的数组具有特有的特征
数组也是一种类型, java数组要求所有的数组元素具有相同的数据类型。因此,在一个数组中,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据。
一旦数组的初始化完成,数组在内存中所占的空间就被固定下来,因此数组的长度将不可改变。即使把某个数组元素清空,但它所占用的空间依然保留,依然属于该数组,数组的长度依然不变。
java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只有所有的数组元素具有相同的类型即可。值得提出的是,数组也是一种数据类型,它本身是一种引用类型。例如,int是一个基本类型,但int[]就是一个引用类型。为了更好的语音及可读性,应该使用第一种定义语法。
数组的定义
java语言支持两种语法格式来定义数组
type[] arrayName;
type arryName[];
为了更好的语音及可读性,应该使用第一种定义语法。因为第一种格式不但具有更好的语义,而且具有更好的可读性。对于type[] arrayName;方式,很容易理解定义了一个变量,其中变量名是arrayName,而变量的类型是type[]。
数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了一个引用变量,这个引用变量还未指向任何有效内存,因此定义数组时不能指定数组长度。而且由于定义数组只是定义了一个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有对数组进行初始化后才可以使用。
数组的初始化
java语言中数组必须先初始化,然后才可以使用。所谓初始化,就是为数组元素分配内存空间,并为每个数组元素赋初值。
数组的初始化方式有两种:
静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
静态初始化语法如下:
arrayName = new type[]{element1, element2, …}
示例:String[] strs = new String[]{};
此外,还有一种简化语法,使用数组常量,如下:
arrayName = {element1, element2, …}
示例:int[] ints = {1, 2, 3,};
数组初始化列表的最后一个逗号都是可选的,这一特性使维护长列表变得更容易。
动态初始化语法如下:
arrayName = new type[length];
示例:double[] ds = new double[0];
动态初始化涉及数组中每个元素的自动初始化问题。当系统为每个元素分配内存空间时,其实是通过将内存空间所 有二进制位设为0,以达到分配初始值的目的的。
多维数组
二维数组允许如下的初始化语法:
arrName = new type[length][]
这相当于定义了length个type[]类型的变量,并且此时这些变量都是null。
更一般的,对于更高维的数组,允许仅指定至少最高维的前任意维的维度,如下:
= new type[length1]…[]…
这导致低维数组元素都是null,所以后续需要对低维数组进行进一步初始化。对低维数组的初始化其实就是数组元素赋值而非定义赋值,所以对于数组常量的赋值方式将不适用。即以下赋值语句将导致编译错误:
intss[1] = {1, 2};
当我们说数组时,一般隐含“一维”这个“默认”前缀,并形象地把其看作一个线性列表;二维数组,我们又赋予矩阵一般的形象,这是“面性”的;三维数组被认为是“体性”的……再高维度的数组似乎就很难形象化了,这使得感观上很难认知。
实质上,Java里的数组可以说只有一维的。
我们先从最简单的多维数组——二维数组来看。一般地,二维数组type[][],该类型的数组变量是一个引用,这个引用指向真实的数组内存对象。此时数组元素类型为type[],也是引用,这个引用指向一维数组内存对象,其元素为type类型。
从这里我们隐隐可以看到递归结构的影子,通过观察更高维数组,这种递归结构很容易归纳出来。对于任意高维数组而言,其本质是一个元素类型为比其低一维的数组组成的一维数组。例如:type[][][][]数组,是一个元素类型为type[][][]的一维数组,type[][][]数组又是一个元素类型为type[][]的一维数组……这样,我们发现,所有数组都是一维的,数组的类型去掉一个[]就是元素类型。
参差数组
由于定义多维数组时,不必定义低维数组的长度,所以这使得多维数组拥有成为“参差数组”的能力,即同一维度下的数组元素中的数组的长度可以是不同的。如下:
int[][] intss = new int[2][];
intss[0] = new int[]{1, 2};
intss[1] = new int[3];
intss是一个二维数组,它有2个元素,都是一维数组,而这2个一维数组,一个长度为2,另一个长度为3。这对于多维数组是允许的。
数组的类型
有的书上说,数组不是一个类,因为无法说出数组的类名。这种说法的准确性是值得商榷的。
首先,每个数组都是有类型的,这一点我们可以透过任意数组都有getClass()方法这点得知。
其次,并非我们不能说出数组的类名,只是盛装不同类型元素的数组其类型是不同的。
所以,数组的确不是一个类,因为它是许多类的一个统称,只是这些类都有相同的集合形式。
下面例举一些数组的类型:
数组 类型(类名)
byte[] [B
short[] [S
int[] [I
long[] [J
float[] [F
double[] [D
char[] [C
boolean[] [Z
String[] [Ljava.lang.String;
int[][] [[I
可以看出,无论什么类型的数组,其类名都是以“[”为前导符的,并且是多少维的数组就会有多少个前导符。另外,对于基本类型的数组而言,其类名都是前导符加上一个特征大写字母组成;而对于常规类型的数组而言,其类名是其元素类型完全限定名加上“L”字母前缀并再加前导符组成。
网络营销词典内容均由网友提供,仅供参考。如发现词条内容有问题,请发邮件至info # wm23.com。