Java中的数组及其一些常见方法的使用
数组
数组是一种数据结构,用来存储同一类型值的集合, 通过整形下标来访问数组中的每一个值
数组的声明及其初始化
声明:
需指明其数据类型,类型后面紧跟 “[ ]”,最后是数组变量的名字;
例如:int [] a;double[] d;
上面的语句只是声明了一个变量,并没有初始化一个真正的数组,应该使用new关键字给数组初始化 例如:
int[] a = new int[100]; double[] d = new double[100];
这里就创建了一个可以存储100个整形类型的数组,和一个可以存储100个双精度浮点类型的数组,数组的长度不要求是一个常量,new int[n];会创建一个长度为n的数组;
数组有两种声明方式:
int [] a; 或者 int a[];
大多数java程序员喜欢第一种风格,因为它将类型与变量的名字分开了
这个数组的下标是从 0 开始的,即数组的第一个值应该是a[0],而不是a[1],创建一个整形数组时,里面所有的元素初始化都是 0 ,Boolean的话,都是false
由于数组的下标是从0 开始的,所以当你访问a[100](任何在0~99之外的下标)时,会出现报错,数组下标越界的报错信息
如一下代码:
public class Main {
public static void main(String[] args)
{
int [] a = new int[4];
System.out.println(a[4]);
}
}
执行结果如下:
我们可以看到出现一段英文,大意为:数组下标越界异常
由于异常,程序终止了运行,如果想要获得数组中元素的个数,可以使用 a.length,如 int i = a.length;
关于length本文的后面会有讲解
java中的数组一旦创建了,就不能改变其大小(虽然可以改变每一个元素)
初始化
有一种比较简单的初始化形式是在数组对象被创建时就对其进行赋值 例如:
int[ ] nums = { 1,2,3,4,5,6,7,8,9}; 这种声明的初始化方式,不需要new关键字
我们还可以命名一个匿名的数组new int [] {1,3,5,7};其中数组的大小就是初始化值的个数,这样,可以在不创建新变量名的请款下,重新初始化一个数组:如 nums = new int {,1,3,5,7,9};
java里面,允许数组的长度为 0,但是 0与null不同
数组拷贝
java中,可以将一个数组变量拷贝给另一个数组变量;这个时候,两个变量引用一个数组:
例:
int [] moneyNumber = {1,2,5,10,20,50,100};
int [] copyNumber = moneyNumber;
拷贝结果如图
此时两个数组变量都是指向同一个地址空间的,改变一个,则两个都将会改变,如果希望将一个数组的所有值拷贝到另一个数组,可以使用Arrays类的copyOf方法:copyNumber = Arrays.copyOf(moneyNumber,moneyNumber.length) ;这样两个变量才不是指向同一个地址空间,方法内的参数,第一个是被复制的数组名,第二个是新数组的长度(这里由于只需要与第一个数组等长的,是使用moneyNumber.length);
二维数组
多维数组将使用多个下标访问数组的元素,适用于表示更加复杂的排列形式。常见的有二维数组(也称为矩阵)、
二维数组和一维数组的命名方式相似
int[][] array = new int[x][y];
如果知道数组的元素,就可以不用new对其进行初始化,就可以直接简写为:
int[][] array =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{0,13,14,15},
}
一旦数组被初始化,就可以利用两个方括号来访问每一个元素,例如array[i][j];
实例:
public class Main {
public static void main(String[] args)
{
int [][] a = new int[4][4];
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
a[i][j] = i + j;
}
}
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
执行结果:
不规则数组
Java中实际没有多维数组,只有一维数组。多维数组被解释为“数组的数组”
这是一个简单的不规则数组:
public class Main {
public static void main(String[] args)
{
int [][] a =
{
{1,2,3,4,5},
{6,7,8},
{9,0},
{5,9,4,1,2,6,7}
};
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
执行结果:
一个不规则数组的简单内存形势图:
可以看到,这相当于一个一维数组,然后数组里面的元素也是一个数组,即数组的数组,这也严格的遵循一维数组的所有限制条件,也能够使用一维数组的所有方法
数组一些常用的方法
方法 | 描述 | 参数类型 |
---|---|---|
方法 | 作用描述 | 参数类型 |
---|---|---|
static String toString(type[] a) | 返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号隔开 | 类型为int 、long、short、char、byte、Boolean、float、double的数组 |
static String copyOf(type[] a,int length) | 返回一个与a类型相同的数组,其长度为length或者end - start数组元素为a的值 | 参数 a:int 、long、short、char、byte、Boolean、float、double的数组;参数start:起始下标(包括这个值);参数end:终止下标(不包括这个值);参数length:拷贝数据长度 |
static String copyOfRange(type[] a,int start,int end) | ||
static void sort(type[] a) | 采用优化的快速排序算法对数组进行排序 | 类型为int 、long、short、char、byte、Boolean、float、double的数组 |
static int binarySearch(type[] a,type v) | 采用二分搜索算法查找值 v,若成功吗,则返回下标,否则返回一个负数值 | 参数 a :int 、long、short、char、byte、Boolean、float、double的数组;参数 start:起始下标(包含这个值);参数end:终止下标(不包含这个值);参数 v :与a的数据元素类型相同的一个值 |
static int binarySearch(type[] a,int start,int end,type v) | ||
static void fill(type[] a,type v) | 将数组的所有数据元素的值设置为v | 参数a :int 、long、short、char、byte、Boolean、float、double的数组;参数 v:与a的数据元素类型相同的一个值 |
static boolean equals(type[] a),type[] b | 如果两个数组大小相等,并且下标相同的元素都对影响等。返回true | 参数a、b:类型为int 、long、short、char、byte、Boolean、float、double的两个数组; |