数组
来源:互联网 发布:情侣礼物一对知乎 编辑:程序博客网 时间:2024/05/23 14:02
数组
1. 数组是Java语言中的一种引用数据类型,它是一组相同类型的数据的有序集合。适用于集中管理类型相同、用途相近的多个数据
µ Java的数组要求所有数组元素具有相同的数据类型。 (可以是基本数据类型,也可是引用数据类型)
µ 一旦数组的初始化完成,数组在内存中所占的存储空间将被固定下来,因此数组的长度不可改变。
µ 通过数组元素的索引号(或者说是下角标)来访问数组元素。
µ 数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种。
2. 数组的维数可以理解为一个数组中数据组合的层次数,只有一个层次的数据组合而成的数组被称为一维数组。两个一维数组再组合而生成的数组称为二维数组。
¯一维数组的声明
格式:类型名变量名[];或类型名[]变量名;(其位置可以放在元素类型之后、数据名之前;也可以位于数据名之后,效果是一样的)
例如: int[] arr;double salary[];
String[] args; Student s[];
µ 声明了数组类型变量,运行时系统只为引用变量分配引用空间,并没有创建对象,也不会为数组元素分配空间,因此尚不能使用任何数组元素。
µ 声明数组类型变量时不允许指定数组的长度:
int[3] a; ×
3. 数组对象的创建和使用
在Java语言中通常使用关键字new创建数组对象,其语法格式为:new类型名[n]
例如,int [] arr;
arr=new int[3];
4. 注意:在访问数组元素时合法的下标范围是0~n-1,如果越界,程序编译时不会报错,但程序运行时会抛越界异常。
5. 例1:基本数据类型的一维数组的声明、创建和使用。
int[] arr=new int[5];
for(int i=0;i<5;i++)
System.out.print(arr[i]+"\t"); //数组一经创建,元素被初始化为默认值0
例2: 引用类型的一维数组的声明、创建和使用。
Point[] p;
p=new Point[5];
for(int i=0;i<5;i++){
p[i]=new Point(i,i+1);
p[i].display();
} 引用类型图解:
6. 数组对象的length属性
数组对象拥有一个有系统自动提供的特殊属性length(以只读的方式给出数组的长度),该属性为int类型,可直接访问,在遍历数组元素时非常有用。
例如,for(inti;i<arr.length;i++)…
注意:Java语言中数组长度并不属于其数据类型的组成部分,一个声明为int[]类型的变量a可以指向一个长度为3的int[]类型数组对象,也可以指向一个长度为5的int[]类型数组对象,例如,int[]a; a=new int[3];a=newint[5];
7. 数组的静态初始化
如果在创建数组对象时已能确定其各元素的值,则可采用一种简化的书写方法来创建和初始化数组对象。
例如:(1) int a[]={12,9,36};
(2) Int a[]=new int(3);
a[0]=12;
a[1]=9;
a[2]=36;
例如:引用类型数组的静态初始化为:
Point[] p={ new Point(3,5),
new Point(-4,9),
new Point(2,-9),
new Point(-5,-2) };//6行代码是一条语句
注:(1)这种简化的创建和初始化数组对象的方式称为数组的静态初始化;(2)这种将创建数组对象以及各数组元素赋值分开进行的方式称为动态初始化。
所谓静态的初始化只是一种简化的书写格式上的约定,既然是约定就不能乱来,例如下面语句是非法的:
Int a[];
a={12,9,36}
静态初始化只能在一行输出。这里所谓的约定,就是规则的制定者认为有用且有效的强制性规定,作为java程序员编码行为的准则,java语言规范实际上就是由一系列的约定(语法规则)组成的。
1. foreach循环
使用foreach循环遍历数组和集合元素时,无须获得数组和集合的长度,无须根据索引来访问数组元素和集合元素,系统自动遍历数组和集合的每个元素。
µ 格式:
for(类型变量名 :数组名 |集合名){
//变量自动迭代访问每个元素...
}
µ 注意:若数组中有n个元素,则该循环就循环n次;每一次循环都将数组中的一个元素赋给变量,循环体就对该变量进行操作。
例如:
String[] names ={"Georgianna","Jen","Simon"};
for (String name : names){
System.out.println(name);
}
注意:
ü使用foreach循环遍历数组元素无须获得数组长度,也无须根据索引来访问数组元素。
ü无须循环条件,无须循环迭代语句,这些部分都由系统来完成。自动迭代数组的每个元素,当每个元素被迭代一次后,foreach循环自动结束。
ü当使用foreach循环时,通常不要对循环变量进行赋值,虽然没有语法错,但极容易引起错误。
ü当使用foreach来迭代访问数组元素时,循环变量相当于临时变量,系统会把数组元素依次赋给这个临时变量,但它并不是数组元素。改变循环变量的值,并不能改变元素的值。因此,如果希望改变数组元素的值,则不能使用这种foreach循环。
2. 多维数组可以理解为由若干低维数组组成的数组,例如,多个一维数组可以组合而成为“二维数组”,多个二维数组组成三维数组…
要访问二维数组中的某个元素,需要知道该元素的位置(第几行、第几列)
3. 二维数组的声明
格式:类型名变量名[][];或类型名[][]变量名;
例如,int[][] s;Student s[][];
(第一个角标(即第一个[])代表行,第二个代表列。)
需注意:声明了数组类型变量,运行时系统只为引用变量分配引用空间,并没有创建对象,也不会为数组元素分配空间,因此尚不能使用任何数组元素。(与一维数组一样)
4. 二维数组对象的创建和初始化
µ 静态初始化
格式:类型[][]数组名={{第0行初值},…,{第n-1行初值}};
例如,int[][]s={{67,89,53},{77,98,68},{57,66,73},{80,88,94},{84,92,90}};
µ 动态初始化
ü (第一种)直接为每一维分配空间
例如,int [][]s=new int[5][3];
ü(第二种)从最高维(即行数)开始(必须从最高维开始),分别为每一维分配空间。(只指定行的个数,不指定列的个数)
例如,int[][]s=new int[3][];
s[0]=new int[3];
s[1]=new int[3];
s[2]=new int[3];
不能这么写:
s[0]={1,2,3};
s[1]={1,2,3};
s[2]={1,2,3};
但可以这么写:
S[0]=new int[3];
s[0][0]=1;
s[0] [1]=2;
s[0] [2]=3;
也可以这么写:
s[0]=new int[]{1,2,3};
s[1]= new int[]{1,2,3};
s[2]= new int[]{1,2,3};
5. 注意: Java中允许二维数组中每行的元素个数不同,即每行的列数可以不同。
例如静态初始化:int[][]={{1,2},{1,2,3},{1,2,3,4}}
例如动态初始化:int[][]s=new int[3][];
s[0]=new int[1]; s[1]=new int[2]; s[2]=newint[3];
6. 注意:使用二维数组s的length属性可获得二维数组高维(即行数)的大小;使用s[i].length属性可获得二维数组每一行的列数,即每一行的元素个数。
for(int i=0;i<s.length;i++){
for(int j=0;j<s[i].length;j++)
sum+=s[i][j];
}
6. 在JDK的java.util包中定义的Arrays类提供了多种数组操作方法,实现了对数组元素的排序、填充、转换、增强检索和深度比较等功能,所有的这些方法都是static的。
¯数组元素的排序方法
原型:publicstatic void sort(<type>[] a);
例如,int[]a={4,12,0,-5,45,-56};
Arrays.sort(a);
例6.7 数组的排序。
注意:数组元素的排序通常指一维数值型数组元素按升序排序,偶尔也会涉及一维String数组的排序,多维和其他引用类型的数组排序实用意义不大。