声明数组
一维数组声明格式:
(1) 数组的元素类型 数组名称[ ];
(2) 数组的元素类型[ ] 数组名称;
二维数组声明格式:
(1) 数组的元素类型 数组名称[ ][ ];
(2) 数组的元素类型[ ][ ] 数组名称;
举例:
float boy[]; // == float[] boy;
char cat[][]; // == char[][] cat;
注意 :
(1) 数组boy的元素类型可以是Java中的任何一种类型。假如已经声明了一个Hello类型,那么就可以声明一个数组: Hello hh[]
;
(2) 与C不同,Java不允许在声明数组的方括号内指定数组的方括号内指定数组元素个数。int a[6]
或int[8] b
等都会导致语法错误。
创建数组及初始化
声明数组仅仅是给出了数组名字和元素的数据类型,如果想要使用还必须为它分配内存空间,即创建数组。
-
静态初始化: 即定义数组的同时对数组进行初始化。
举例:int[] a={1,2,3,4,5}; //这样就间接创建了一个拥有5个元素的数组
-
动态初始化: 使用运算符new为数组分配空间。格式为:
数组名字 = new 数组元素的类型[数组元素的个数]
举例:int a[]; //声明 a = new int[5]; //创建一个元素值为五个的数组 a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; //同上面静态初始化的值
-
声明数组和创建数组可以一起完成
float xiao[] = new float[5]; //一维数组的创建 int lin[][] = new int[4][3]; //当然也可以分开,先声明后创建
-
Java采用“数组的数组”声明多维数组,即一个二维数组是由若干个一维数组组成的,
比如上述创建的二维数组lin就是由4个长度为3的一维数组lin[0]
,lin[1]
,lin[2]
,lin[3]
构成的。 -
!!! 构成二维数组的一维数组不必要有相同的长度,在创建二维数组时可以分别指定构成该二维数组的一维数组的长度。
int lin[][] = new int[4][]; //未完成创建数组,该数组还不能使用 lin[0] = new int[1]; lin[1] = new int[2]; lin[2] = new int[3]; lin[3] = new int[4]; //完成,一维数组大小我是随意定的 //也可以使用下面的方式 int lin[][] = {{9},{2,5},{8,9,4},{3,2,1,7}};//分配内存大小和上面相同
数组变量a中存放着这些内存单元的首地址,该地址称作数组的引用。
数组元素的使用
- 一维数组通过索引符访问自己的元素。注意索引符从0开始,若数组有10个元素,那么索引为0~9。
- 二维数组也是如此。举个栗子给大家尝尝:
int lin[][] = new int[4][3]; //第一个索引为0~3,第二个索引为0~2 lin[3][2] = 12; lin[0][0] = 1;
length的使用
说明: 数组的元素个数称为数组的长度。
- 对于一维数组,“数组名字.length”的值就是数组中元素的个数;
- 对于二维数组,“数组名字.length”的值为它含有的一维数组的个数。
float xiao[] = new float[5]; //xiao.length的值为5
int lin[][] = new int[4][3]; //lin.length的值为4
数组的引用
数组为引用型变量,因此,两个相同类型的数组如果具有相同的引用,它们就会有完全相同的元素。
对于 :
int a[] = {1,2,3};
int b[] = [4,5];
a = b; // a,b类型必须相同
如果这么处理,a中存放的引用和b的相同,系统将释放最初分配给数组a的元素,使得a的元素和b的元素相同。
举个栗子做个小小的总结:
import java.util.Arrays; //输出数组,下面会讲到
public class Example3{
public static void main(String args[]){
int a[] = {1,2,3};
int b[] = {4,5};
System.out.println("数组a的元素个数 = "+a.length);
System.out.println("数组b的元素个数 = "+b.length);
System.out.println("数组a的引用 = "+a);
System.out.println("数组a的引用 = "+b);
System.out.println("a==b的结果为 "+(a==b));
a = b;
System.out.println("数组a的元素个数 = "+a.length);
System.out.println("数组b的元素个数 = "+b.length);
System.out.println("a==b的结果为 "+(a==b));
System.out.println("a数组:"+Arrays.toString(a));
System.out.println("b数组:"+Arrays.toString(b));
运行结果如下,其余自行体会:
x1aolin@x1aolin-E402NA:~/桌面$ java Example3
数组a的元素个数 = 3
数组b的元素个数 = 2
数组a的引用 = [I@c39f790
数组a的引用 = [I@71e7a66b
a==b的结果为 false
数组a的元素个数 = 2
数组b的元素个数 = 2
a==b的结果为 true
a数组:[4, 5]
b数组:[4, 5]
复制数组
通过上面的讲述我们知道,数组属于引用类型,所以在复制数组的时候不能简单的执行
b=a
这类代码。
因为此操作只能使他们指向相同的内存单元,此时改变a[1]也就是改变了b[1],并不是实际的复制了数组。
下面介绍Java中三种复制方法,各有利弊,请自行评判。
1.arraycopy方法
利用循环把一个数组的元素的值赋给另一个数组中的元素。这里用System类调用方法:
public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
可以将数组sourceArray从索引index1开始的length个元素中的数据复制到数组copyArray中,copyArray数组从第index2元素开始存放这些数据,如果数组copyArray不能存放下复制的数据,程序运行将会发生异常。下面给出示例:
import java.util.Arrays;
public class Example4{
public static void main(String args[]){
char a[] = {'a','b','c','d','e','f'};
char[] b = new char[6];
b[0]='1';b[1]='2';b[2]='3';b[3]='4';b[4]='5';b[5]='6';
int[] c;
c = new int[6];
c[0]=1;c[1]=2;c[2]=3;c[3]=4;c[4]=5;c[5]=6;
int d[] = {10,20,30,40,50,60};
//复习前面的内容
System.arraycopy(a,0,b,0,a.length);
System.arraycopy(c,2,d,2,(c.length-3));
System.out.println("数组a:"+Arrays.toString(a));
System.out.println("数组b:"+Arrays.toString(b));
System.out.println("数组c:"+Arrays.toString(c));
System.out.println("数组d:"+Arrays.toString(d));
}
}
运行结果如下:
x1aolin@x1aolin-E402NA:~/桌面$ vim Example4.java
x1aolin@x1aolin-E402NA:~/桌面$ javac Example4.java
x1aolin@x1aolin-E402NA:~/桌面$ java Example4
数组a:[a, b, c, d, e, f]
数组b:[a, b, c, d, e, f]
数组c:[1, 2, 3, 4, 5, 6]
数组d:[10, 20, 3, 4, 5, 60]
缺点: 事先必须创建参数copyArray指定的数组。
2.copyOf和copyOfRange方法
Array类用copyOf调用方法有:
public static double[] copyOf(double[] original,int newLength)
public static float[] copyOf(float[] original,int newLength)
public static int[] copyOf(int[] original,int newLength)
public static char[] copyOf(char[] original,int newLength)
可以把参数original指定的数组中从索引0开始的newLength个元素复制到一个新数组中,并返回这个新数组,且该新数组的长度为newLength。
如果newLength的值大于original的长度,则其余的用0补齐。
Array类用copyOfRange调用方法有:
public static double[] copyOfRange(double[] original,int from,int to)
public static float[] copyOfRange(float[] original,int from,int to)
public static int[] copyOfRange(int[] original,int from,int to)
public static char[] copyOfRange(char[] original,int from,int to)
复制部分值。把参数original指定的数组中从索引from至to-1的元素复制到一个新数组中,并返回这个新数组,即新数组的长度为to-from。当然,如果新数组比原数组长,则多的那个部分补0。示例如下:
import java.util.*;
public class Example5{
public static void main(String args[]){
int[] a = {10,20,30,40,50,60},b,c,d;
b = Arrays.copyOf(a,10);
System.out.println("数组a:"+Arrays.toString(a));
System.out.println("数组b:"+Arrays.toString(b));
c = Arrays.copyOfRange(a,2,5);
System.out.println("数组c:"+Arrays.toString(c));
d = Arrays.copyOfRange(a,3,9);
System.out.println("数组d:"+Arrays.toString(d));
}
}
运行结果如下,其余自行体会:
x1aolin@x1aolin-E402NA:~/桌面$ vim Example5.java //ubuntu命令行的操作
x1aolin@x1aolin-E402NA:~/桌面$ javac Example5.java
x1aolin@x1aolin-E402NA:~/桌面$ java Example5
数组a:[10, 20, 30, 40, 50, 60]
数组b:[10, 20, 30, 40, 50, 60, 0, 0, 0, 0]
数组c:[30, 40, 50]
数组d:[40, 50, 60, 0, 0, 0]
补充1:数组的表示格式
前提: 引用
import java.util.Arrays
,以后的博客中会讲到。
除了向C/C++中一样用循环输出数组的值外,JDK1.5版本提供了一个简单的
输出元素值的放大。
让Arrays类调用:public static String toString(int[] a)
方法,
可以得到参数指定的一维数组a的数据,格式如下:[a[0],a[1],a[2], ... ,a[a.length-1]]
示例在上面“数组的引用”模块已经给出,此处不再示例。
补充2:Java数组排序
这里重点说明Arrays类调用方法实现对数组的快速排序。两种调用方法:
public static void sort(double a[])
public static void sort(double a[],int start,int end)
补充3:对已排序数组进行二分查找
public static int binarySearch(double[] a,double number)
判断参数number指定的数是否在参数a指定的数组中,如果number在数组中,返回该元素的索引,如果找不到便返回一个负数。示例如下:
import java.util.*;
public class Example6{
public static void main(String args[]){
int []a = {5,8,2,1,9,3,6,4,7};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
int number = 6;
int index = Arrays.binarySearch(a,number);
if(index>=0){
System.out.println(number+"和数组中的索引为"+index+"的元素值相同");
}
else{
System.out.println(number+"不与数组中的任何元素值相同");
}
}
}
运行结果如下,其余自行体会
x1aolin@x1aolin-E402NA:~/桌面$ vim Example6.java
x1aolin@x1aolin-E402NA:~/桌面$ javac Example6.java
x1aolin@x1aolin-E402NA:~/桌面$ java Example6
[1, 2, 3, 4, 5, 6, 7, 8, 9]
6和数组中的索引为5的元素值相同