目录
数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。
1、数组的声明
1.1、一维数组的声明
type[] arrayName; //声明方式一
type arrayName[]; //声明方式二
注意,声明数组时不能指定数组长度。
1.2、二维数组的声明
type[][] arrayName; //声明方式一
type[] arrayName[]; //声明方式二
2、数组的初始化
所谓初始化,就是为数组分配内存空间,并为每一个元素赋初值。数组的初始化有两种方式:静态初始化和动态初始化。
2.1、一维数组的静态初始化
静态初始化是指初始化时直接显式地给出每个数组元素的初始值,由系统根据元素个数决定数组的长度。语法格式如下:
arrayName = new type[]{元素1, 元素2, 元素3...}
例:
int[] array;
array = int[]{1, 2, 3};
//或
int[] array = new int[]{1, 2, 3};
//或
int[] array = {1, 2, 3};
2.2、一维数组的动态初始化
动态初始化是指初始化时先为数组指明长度(分配内存空间),再为数组中元素赋初值。语法格式如下:
type[] arrayName = new type[length];
例:
int[] arrayInt = new int[3];
String[] arrayString = new String[3];
2.3、二维数组的静态初始化
语法格式如下:
arrayName = new type[][]{元素1, 元素2, 元素3...}
例:
int[] array = new int[][]{{80, 85}, {90, 94, 80}};
注意,二维数组每一行存储的元素个数可以是不相同的。
2.4、二维数组的动态初始化
由于二维数组是存储多行多列的数据,二维数组的动态初始化分两种情况:
(1)直接为每个元素分配空间
语法格式和实例如下:
type[][] arrayName = new type[arrayLength1][arrayLength2];
int[][] arrayInt = new int[2][3];
(2)从高维开始,分别为每一维分配空间
即首先要确定二维数组的行数,然后再为每一行分配各个元素的内存空间,如:
int[][] intArray;
intArray = newint[3][];
intArray[0] = new int[1];
intArray[1] = new int[2];
intArray[2] = new int[3];
3、匿名数组
匿名数组即不声明变量名,而直接初始化一个匿名的数组: new int[] {17, 19, 23, 29, 31, 37},如:
int[] smallPrimes;
smallPrimes = new int[] {17, 19, 23, 29, 31, 37};
//等同于
int[] smallPrimes;
int[] anonymous = {17, 19, 23, 29, 31, 37};
smallPrimes = anonymous;
4、for each循环
Java有一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心,语句格式为:
for(variable:collection) statement
例:
for(int element : a) System.out.println(element);
打印数组a的每一个元素。
传统for循环:
for(int i = 0; i < a.lenght; i++) System.out.println(a[i]);
for each循环语句相较于传统的for循环更加简介、更不易出错(不必为下标的起始值和终止值而操心)
注:要想获得数组中的元素个数,可以使用array.length。
注:for each循环语句的循环变量将会遍历数组中的每个元素,而不需要使用下标值。
5、命令行参数
每一个Java应用程序都有一个带String[] args参数的main方法,这个参数表明main方法将接受一个字符串数组,也就是命令行参数。
例:
public class Message{
public static void main(String[] args){
if(args[0].equals("-h")) System.out.print("Hello,");
else if(args[0].equals("-g")) System.out.print("Goodbye,");
//print the other command-line arguments
for(int i = 1; i < args.length; i++) System.out.print(" " + args[i]);
System.out.print("!");
}
}
运行结果示例:
6、数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个数组变量引用同一个数组:
int[] smallPrimes = {2, 3, 5, 7, 11, 13};
int[] luckyNumbers = smallPrimes;
smallPrimes[5] = 12; // now luckyNumbers[5] is also 12.
如果希望一个数组的值全部拷贝到另一个数组上,要使用Arrays类的copyTo方法:
int[] smallPrimes = {2, 3, 5, 7, 11, 13};
int[] copiedLuckyNumbers = Arrays.coopyOf(smallPrimes, smallPrimes.length);
注:Java数组与C++数组在堆栈上有很大不同,但基本上与分配在堆(heap)上的数组指针一样。也就是说,int[] a = new int[100]; //Java 不同于 int a[100]; //C++ 而等同于 int *a = new int[100]; //C++
7、数组排序
要想对数值型数组进行排序,可以使用Arrays类中的sort方法:
int[] a = new int[1000];
......
Arrays.sort(a)
这个方法使用了优化的快速排序算法。
8、常用API
位于java.util.Arrays 1.2版本中的一些常用API:
static String toString(type[] a):返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。
static type copyOf(type[] a, int length)
static type copyOf(type[] a, int start, int end):返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。
static void sort(type[] a):采用优化的快速排序算法对数组进行排序。
static int binarySearch(type[] a, type v)
static int binarySearch(type[] a, int start, int end, type v):采用二分搜索算法找值v,如果查找成功,则返回下标值,否则返回一个负数值r。
static void fill(type[] a, type v):将数组的所有数据元素值设置为v。
static boolean equals(type[] a, type[] b):如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。