Java中的数组


本章介绍Java中预定义好的两个类:数组与字符串的使用。它们也是所有程序设计语言必须要处理的两类数据结构。在传统语言(例如C)中,数组和字符串都只是一片连续的内存空间,用于存放同类型的数据,语言本身并没有为它提供更多的支持。Java将其设计为对象,内置了更多的方法,降低了程序员的工作量。另外一方面,Java会对数组的下标进行检测,如果有下标越界的情况,就会及时报告,避免了困扰C/C++程序员的一大难题。下面就从数组开始讲起。

  一维数组

数组是一种最简单的复合数据类型。它是存放具有相同数据类型的数值的数据结构,它的每一个元素都具有同一个类型,先后顺序也是固定的。数组一旦创建之后,大小就固定了,不在发生变化。它的数据类型既可以是简单类型,也可以是类。在生成一个数组的时候是通过数组名进行的,而使用数组中存储的值时只能以数组元素为单位进行。一个数组中所拥有的元素数目称为该数组的长度。数组通常分为一维数组、二维数组和多维数组。但是使用比较多的还是前两种。

一维数组的声明及引用

一维数组可以存放上千万个数据,它是一组相关的存储单元,这些存储单元在逻辑上被看作是相互独立的若干元素,它们具有相同的名字和数据类型。数组中的某个特定的元素由它的下标决定。只带有一个下标的数组称之为一维数组。

1.声明

声明一个一维数组的形式如下:

数据类型  数组名[]

或者:

数据类型 [] 数组名

这里的数据类型就是元素所拥有的类型,常见的类型有整型、浮点型与字符型等。数组名是用户自己定义的合法的标识符,用来统一这组相同数据类型的元素的名称,其命名规则和变量的相同,[]表示这是一个数组。数组一旦被定义,它的数据类型和数组名就不可更改。

2.初始化

由于数组不过是一种特殊的类,Java在数组声明时并不为数组分配存储空间,因此在声明的[]中不能指出数组中元素的个数即数组的长度,所以声明之后并不能立即使用,必须经过初始化,分配存储空间后,才能访问数组的元素。为数组分配存储空间有两种方式:初始化和使用关键字new。

1)初始化

数组的初始化指的是在声明数组的同时为其元素赋初值,它的初始化格式如下:

数据类型  数组名[] = {值1,值2……,值n};

“{}”中是初始化表,在声明的时候,并不需要将数组元素的个数列出,编译器根据所给出的初值个数来判断数组的长度。为这个数组分配足够的内存空间,并在这些空间中依次填入这些值。

例如:

int arry[ ]={0,1,2,3,4,8,66};

double day[ ]=(10.2,45.9,1236.52,4.2359,0.23569);

String strArry[ ]=(“hellow”,”thank you”,”good_bye”);

在上面的语句中,声明了一个整型数组arry,虽然没有特别指明数组的长度,但是由于大括号里的初值有7个,编译器会按着从0-6的须序将各元素存放,arry [0]0arry1]1,…,arry [6]66Java中任何一个长度为n的数组,它的第一个元素的下标总是从0开始,最后一个元素的下标总是n-1。

2)使用关键字new

通过使用new运算符可以为数组分配存储空间和指定初值,它的一般形式是:

数据类型  数组名[];

数组名 = new  数据类型 [数组长度];

或者将声明与创建写在一起:

数据类型  数组名[] = new  数据类型 [数组长度];

其中数据类型和数组名与声明时的相同,数组声明后,接下来便是要配置数组所需的内存,其中“数组长度”是告诉编译器,所声明的数组要存放多少个元素,而“new”则是命令编译器根据括号里的个数,在内存中开辟一块内存供该数组使用。

例如:

int a[]; //声明数组a

a=new int[5]; //为数组a分配5个整型的存储空间

double b = new double[10]; //为数组b分配10个双精度的存储空间

一旦数组初始化或用new为数组分配了存储空间以后,该数组的长度即被固定下来,不能再进行更改,除非再new一个新的数组,重新分配存储空间。

注意:对同一个数组再次动态分配空间时,即用new运算符创建。若该数组的存储空间没有进行另外的存储,那么该数组的数据将会丢失,例如:

int arry[]={11,12,13,14,15};

arry[]=new int[10];

在这里通过new运算符为arry数组重新分配的空间,那么它原来的数据11,12,13,14,15将丢失。

3.引用

要使用一个数组,其实使用的是这个数组中的元素。想要使用数组里的元素,可以利用索引来完成。Java的数组索引编号由0开始到数组长度-1为止。数组元素的使用形式如下

数组名[下标]

[]中的下标是介于[0,数组长度-1]之间的整型数,也可以是byteshortchar等类型,但是不允许为long型,当然下标也可以是合法的表达式。数组元素是一个普通的变量,它可以出现在任何同类型的普通变量能够出现的地方,执行普通变量能够进行的任何操作。

如果想要直接访问某数组中的最后一个元素,这时就需要用到数组的一个属性:length。它是一个特殊的属性,表示数组共有多少个元素,也是数组的长度。每次创建数组对象时,会为这个属性赋值,用户程序无法直接改变这个值。它的具体用法如下:

数组名.length

【代码剖析】下面这段程序说明了一维数组的使用方法,具体代码如下:

public class ArryClass_1 {

public static void main(String args[]) {

int i;

int arry[]; // 声明一个整型数组arry

arry = new int[10]; // 开辟内存空间供整型数组arry使用,其元素个数为10

System.out.println("数组长度是: " + arry.length); // 输出数组长度

for (i = 0; i < 10; i++) { // 输出数组的元素内容

System.out.print("a[" + i + "] = " + arry[i] + ",");

 if (i % 2 == 1){ //控制打印行数,每行打2个元素

System.out.println();

}

}

}

}

运行结果如下:

数组长度是: 10

a[0] = 0,a[1] = 0,

a[2] = 0,a[3] = 0,

a[4] = 0,a[5] = 0,

a[6] = 0,a[7] = 0,

a[8] = 0,a[9] = 0,

【解释说明】声明了一个整型数组a并用new运算符为其分配存储空间,以供整型数组a使用,其元素个数为10。然后利用for循环输出数组的内容。由于程序中并未给予数组元素赋值,所以数组元素都指向了int的缺省值0,因此输出的结果都是0arry.length代表数组的长度为10,也就是说数组元素的个数是10

1.1数组元素初始化值

元素类型

初始化值

byte

0

short

0

int

0

long

0

char

‘\U0000’

float

0.0f

double

0.0d

boolean

false

Object Reference

null

二维数组

如果数组的元素不是基本数据类型而是数组,那么这种结构称为多维数组。最简单而又最常用的多维数组是二维数组。二维数组是由若干个一维数组组成的一维数组,它的每个元素都是一个一维数组。由于一维数组是对象,所以二维数组也可以看成是由若干对象组成。

5.2.1  二维数组的声明及引用

虽然一维数组可以处理一般简单的数据,但是在实际的应用上还是显的不够用,如果数组的元素不是基本数据类型而是数组,那么这种结构称为多维数组。Java中,多维数组被看成数组的数组。

最简单而又最常用的多维数组是二维数组。二维数组是由若干个一维数组组成的一维数组,它的每个元素都是一个一维数组。由于一维数组是对象,所以二维数组也可以看成是由若干对象组成。

1.声明

声明一个二维数组的形式有3种:

数据类型  数组名[][]  

或者:

数据类型[][]  数组名

或者:

数据类型[]  数组名[]

在上述声明中的数据类型,是指的元素中存储的数据的类型。它可以是简单的数据类型,也可以是复合类型。和一维数组一样,两个“[]”中都必须是空的。

下面都是一些合法的二维数组的声明:

int a[][];

double [][]b;

myClass [] c[];

2.初始化

q 二维数组初始化同一维数组一样,在声明数组的同时为数据元素赋初值,它的一般形式是:

数据类型  数组名[][]={{初始值表1},{初始值表2},……{初始值表n}};

其中的每个“{初始值表i}”对应二维数组的第i个元素(也就是第一个一维数组),并为这个一维数组做初始化。Java系统会根据初始化给出的初始值的个数自动计算出数组每一维的大小。有多少个这样的初始值表,就表示这个二维数组的长度是多少(也就有多少个一维数组)。二维数组的第一个元素的下标也是从0开始,最后一个元素下标是长度值减1。

注意:由于二维数组可以看作是一维数组的数组,所以数组的内存空间不一定是连续的,所以不要求二维数组中每一维的大小必须相同。

例如:char c [][]={{' a ' , ' b ', ' c '},{'d', 'e'},{'f', 'g', 'h'}};

在上面的语句中,声明了一个字符型数组c,数组有33列共9个元素,大括号里的几组初值会分别依序指定给各行里的元素存放,如c[0][0]ac[0][1]b,…,c[1][0]char型的系统默认的初值。

二维数组声明的方式和一维数组类似,内存的分配也一样是用new这个关键字,它的内存分配格式如下:

数据类型  数组名[][]

数组名 = new 数据类型[行的个数][列的个数]

数据类型 数组名[][] = new 数据类型[行的个数][列的个数]

与一维数组不同的是,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数。 “行的个数”是告诉编译器所声明的数组有多少行,(行数指的是一维数组的个数)“列的个数”则是说明该数组有多少列(一个一维数组中有多少个元素)。

例如:int a[][]=new int[4][6];

这里创建了一个46列的整型二维数组a,它仍然由4个一维数组组成,每一个一维数组的长度都是6

3.引用

正如前面所提到的,Java中的二维数组的元素应该是一维数组,但是一维数组还是个复合类型,只能访问它是引用,所以使用二维数组内的真正的元素其实是一维数组内的简单类型元素,但是一维数组为多个,怎样区分到底要访问的是哪个一维数组中的元素呢?Java是通过以下方式来引用二维数组的元素的,它的引用形式为:

数组名[行号][列号]

例如:

n = a[3][4];

表示要访问二维数组a的第4个一维数组中的第5个元素。如果要访问所有元素中的第一个,应该这么写:

n = a[0][0];

如果要直接访问所有元素中的最后一个,要这么写:

r = a.length - 1;

cl = a[r].length - 1

k = a[r][cl];

注意:

不管在多维数组中还是一维数组中,下标都是从0开始到数组的长度-1为止。

数组名.length            // 取得数组的行数即一维数组的个数

数组名[行的索引].length   //取得特定行元素的个数即指定的一维数组内的元素的个数

【代码剖析】下面这段程序说明了二维数组的使用方法,具体代码如下:

public class ArryClass_2 {

public static void main(String args[]) {

int i, j, sum = 0;

int score[][] = { { 60, 70, 85, 45 }, { 89, 78, 86, 66 } ,{56,84,76,91}}; //声明数组并设置初值

for (i = 0; i < score.length; i++)

{   sum=0;    

System.out.print("" + (i + 1) + " 个人的成绩为:");

for (j = 0; j < score[i].length; j++) {

System.out.print(score[i][j] + " "); //输出个人单课成绩

sum += score[i][j]; //计算总成绩

}

System.out.println("总成绩为:"+sum)

}

}

}

运行结果如下:

1 个人的成绩为:60 70 85 45 总成绩为:260

2 个人的成绩为:89 78 86 66 总成绩为:319

3 个人的成绩为:56 84 76 91 总成绩为:307

【解释说明】上面这段程序利用整数变量ij做为外层与内层循环控制变量及数组的下标,变量i控制行的个数,变量j控制一行中列的个数;而sum则使用来存放所有数组元素值的和,也就是总成绩。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值