📄 java05_01.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Java程序设计</title>
</head>
<body background="Bg.gif">
<p align="center"><font size="5"><b>§5.1 数组</b></font></p>
<p align="left"> 数组是Java中一种重要的数据结构。和一般的语言不同,Java中的数组也是对象,需要动态地生成。除此之外,它的使用和C中的数组差不多。</p>
<p align="left">
数组是同类型的数据的有序集合,它的每一个元素都具有同一个类型,先后顺序也是固定的。它的数据类型既可以是简单类型,也可以是类。在生成一个数组的时候是通过数组名进行的,而使用数组中存储的值时只能以数组元素为单位进行。我们将一个数组中所拥有的元素数目称为该数组的长度。</p>
<p align="left">
数组通常分为一维数组、二维数组和多维数组,我们这里只介绍前面两种。</p>
<p align="left">一、一维数组的定义与使用</p>
<p align="left">1.一维数组的定义</p>
<p align="center"><b>数据类型 数组名[]</b> 或者: <b> 数据类型[]
数组名</b></p>
<p align="left">
这里的数据类型就是元素所拥有的类型,数组名是用户自己定义的合法的标识符,[]表示这是一个数组。注意[]必须是空的,不允许在其中指定数组的长度。数组一旦被定义,它的数据类型和数组名就不可更改。</p>
<p align="left">2.创建一个数组</p>
<p align="left">
创建一个数组有三种方法:初始化和用new来生成。</p>
<ul>
<li>
<p align="left"> int a[]={0,0,0,0,0};</li>
<li>
<p align="left">int a[]=new int[5];</li>
<li>
<p align="left">利用数组的clone()方法,如:<br>
int[] b=(int [])a.clone()</li>
</ul>
<p align="left">
前两种方法都创建了一个名为 a
的整型数组,长度都是5(也就是拥有5个整型元素)。第一种方法显示地将每个元素都置为0(当然也可以赋别的值);第二种方法没有给元素赋值,但系统会自动为每个元素赋初始值0,所以效果是一样的。第三种方法是创建了一个和a长度一样的数组b,它的每个元素和a中的对应相等,但它和a不是同一个数组,它实质上是将a复制了一份给b。还有一种方法也可以“创建”数组:<br>
int[] b=a;<br>
但这种方法实质上是增加了一个对a的引用(有点类似于C中的指针),b和a目前是同一个数组的两个不同名字。</p>
<p align="left">
创建了数组后,如果有需要,可以随时用new来调整数组的长度(但数据类型和名称不能改),但是数组中原来的元素值不再保留。</p>
<p align="left"> 上面的例子中元素是int型,如果是用其它类型,则new后的数据类型说明符也要改成相应的类型,如下面这个样子:<br>
double a[]
=new double[10];</p>
<p align="left">3.使用数组</p>
<p align="left"> 要访问一个数组元素,需要用:<br>
数组名[下标]<br>
这种方式,其中的下标是大于等于0小于数组长度的整型数。<b>数组元素就是一个普通的变量,它可以出现在任何同类型的普通变量能够出现的地方,执行普通变量能够进行的操作。</b></p>
<p align="left"> 我们先来看下面这个例子:</p>
<p align="left">class useArray{<br>
public static void main(String argv[]){<br>
int i, a[]={0,0,0,0,0}; //初始化,创建一个有5个元素的整型数组a<br>
int[]
b;
//定义一个整型数组b<br>
a=new int [10];
//重新调整a的长度,现在有10个元素<br>
for(i=0;i<10;i++)<br>
{ a[i]=i;
//使用a中的元素<br>
System.out.print(" "+a[i]);<br>
} <br>
a[10]=0; //错误,下标越界<br>
b=a; //正确,b引用了a,现在a和b实际上是同一个数组 <br>
a[9]=100; //改变了a中的元素值就改变了b中的元素值<br>
for(i=0;i<10;i++)<br>
System.out.print(" "+b[i]); //这里实际上输出的就是a中的元素<br>
}<br>
}</p>
<p align="left">
这个例子很简单,但它清楚地说明:对于长度为N的数组,它的元素下标是从0到N-1。对于上例,如果企图使用:a[10]=0;就会出现下标越界的错误。</p>
<p align="left">4.一个完整的例子</p>
<p align="left">
在这个例子中,我们将用到数组对象的一个属性length,它返回当前这个数组的长度,但这个属性是只读的。另外我们将数组作为参数传递给一个方法。由于数组也是一个对象,所以在传递参数时是引用,对形式参数的任何改动都会影响到实际参数。</p>
<p align="left">//下面这个例子是以选择排序法对整型数组进行排序<br>
class selectSort{<br>
public static void main(String argv[]){ <br>
final int N=10;<br>
int i,a[]=new int[N];<br>
<br>
initialize(a);
//为数组元素赋一些随机值<br>
System.out.print("The origin array is:");<br>
for (i=0;i<a.length;i++) //输出未排序的数组<br>
System.out.print(" "+a[i]);<br>
Sort(a);
//进行选择排序<br>
System.out.print("\nThe sorted array is:"); <br>
for (i=0;i<a.length;i++) //输出排序后的数组<br>
System.out.print(" "+a[i]);<br>
}<br>
<br>
static void initialize(int a[]){ //为数组a赋初值<br>
int i;<br>
for (i=0;i<a.length;i++)<br>
a[i]=(int)(Math.random()*1000);<br>
} <br>
<br>
static void Sort(int a[]){ //对数组a进行选择排序<br>
int i,j,min,t;<br>
for(i=0;i<a.length-1;i++) <br>
{ min=i;<br>
for(j=i+1;j<a.length;j++)<br>
if (a[min]>a[j]) min=j;<br>
if (min!=i) <br>
{ t=a[i];<br>
a[i]=a[min];<br>
a[min]=t; <br>
}<br>
}<br>
}<br>
}</p>
<p align="left"> 二、二维数组的定义和使用</p>
<p align="left">
如果数组的元素也是数组,那么这种结构称为多维数组。最简单而又最常用的多维数组是二维数组。二维数组可以看成是由若干个一维数组组成的。 </p>
<p align="left">1.二维数组的定义:</p>
<p align="center"><b>数据类型 数组名[][]</b> 或者:<b> 数据类型[][]
数组名</b> 或者:<b>数据类型[] 数组名[]</b></p>
<p align="left">
最后一种定义方法直接表明了二维数组的定义,但这种方法很少用,常用的还是前面两种。和一般语言中的二维数组不同,Java中的二维数组允许每行中的元素个数不同,换言之,就是构成二维数组的每个一维数组的长度可以不相同。</p>
<p align="left">2.创建二维数组</p>
<p align="left">
二维数组必须要创建后才能使用,它也有多种创建方法</p>
<p align="left">① 初始化</p>
<p align="left"> int b[][]={{1,2},{3,4,5},{6,7,8,9}};</p>
<p align="left"> 这里的二维数组b由3个一维数组构成,每个一维数组的名字依次是:b[0]、b[1]、b[2],它们的长度分别是2,3,4,可以想像成下面这个图:</p>
<p align="left"><img border="0" src="picture/java05_01_01.gif" width="138" height="85"></p>
<p align="left">② 利用new一次性创建</p>
<p align="left"> int b[][]=new int[3][4];</p>
<p align="left"> 这里创建了一个3行4列的二维数组b,它仍然由3个一维数组组成,每一个一维数组的元素数目都是4,每个元素的值都是0,可以想像成下面这个图:<br>
</p>
<table border="1" width="41%">
<tr>
<td width="20%" bordercolor="#FFFFFF"><b>b[0]</b></td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
</tr>
<tr>
<td width="20%" bordercolor="#FFFFFF"><b>b[1]</b></td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
</tr>
<tr>
<td width="20%" bordercolor="#FFFFFF"><b>b[2]</b></td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
<td width="20%">0</td>
</tr>
</table>
<p align="left">
这种方法最简单,也很常用,缺点是每一行的元素数目必须一样多,有时会造成浪费。</p>
<p align="left">③ 利用new分批创建,这需要写一段程序:</p>
<p align="left"> int b[][];<br>
......<br>
b=new int[3][]; //先将b创建成由3个一维数组组成 <br>
b[0]=new int [1]; //再分别创建每个一维数组<br>
b[1]=new int [2];<br>
b[2]=new int [3];</p>
<p align="left"> 执行上面这段程序之后,b成了下面这个样子:<br>
<img border="0" src="picture/java05_01_02.gif" width="121" height="85"></p>
<p align="left">④ 利用数组的clone()方法,如:</p>
<p align="left">int b[][]={{1,2},{3,4,5},{6,7,8,9}};<br>
int a[][]=(int [][])b.clone();</p>
<p align="left"> 这样a就拥有了和b一模一样的结构。</p>
<p align="left">⑤ 也可以采用引用的方法来“创建”:</p>
<p align="left">int b[][]={{1,2},{3,4,5},{6,7,8,9}};<br>
int a[][]=b;</p>
<p align="left">
如同在一维数组的定义中所提到的,这种方法只是增加了b的一个引用,a和b是同一个数组的两个名字。</p>
<p align="left">3. 二维数组的使用</p>
<p align="left"> 严格来说,Java中的二维数组的元素应该是一维数组,不过由于传统语言都是将存储数据的单元当作是二维数组的元素,我们这里也可以这样理解,而且也不会造成混乱。基于这样的理解,要访问二维数组中的元素要写成下面这个样子:</p>
<p align="center">数组名[行号][列号]</p>
<p align="left">
我们来写个简单的例子,看如何遍历一个二维数组,输出其中的元素。</p>
<p align="left">class TwoDime{<br>
public static void main(String argv[]){ <br>
int b[][]={{1,2},{3,4,5},{6,7,8,9}}; //这里用三种不同的方法定义二维数组<br>
int[][] a=b; //a是b的一个引用<br>
int[] c[]; <br>
int i,j;<br>
//先输出数组a<br>
for(i=0;i<a.length;i++) //这了的a.length返回数组a有几个一维数组,也即行数<br>
{ for(j=0;j<a[i].length;j++) //a[i].length返回当前这个一维数组的长度<br>
System.out.print(" "+a[i][j]);<br>
System.out.println() ;<br>
} <br>
c=new int[3][]; //下面创建数组c<br>
for (i=0;i<3;i++)<br>
c[i]=new int[i+1];<br>
for(i=0;i<c.length;i++)<br>
{ for(j=0;j<c[i].length;j++)<br>
System.out.print(" "+c[i][j]);<br>
System.out.println() ;<br>
} <br>
}<br>
}</p>
<p align="left"> 在上面的例子中,a.length和a[i].length都是很重要的属性,因为Java中的二维数组是动态的,而且每行中的元素数目可能并不相同,不能像C语言那样写成固定的数值来控制循环。</p>
<p align="left">四、课堂练习</p>
<p align="left">请写一个类,用于输出杨辉三角。具体要求:<br>
1、拥有一个二维数组,是private类型的成员变量,用于存储杨辉三角<br>
2、一个构造方法,它有一个形式参数,指定本杨辉三角的行数<br>
3、一个输出方法,将杨辉三角显示在屏幕上<br>
杨辉三角如下所示:<br>
1<br>
1 1<br>
1 2 1<br>
1 3 3 1<br>
1 4 6 4 1</p>
<p align="left"><a href="index.htm">回目录</a> <a href="java04_13.htm">上一课</a>
<a href="java05_02.htm">下一课</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -