3.10 数组
数组是一种数据结构,用来存储同一类型值的集合.当声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字.如下所示:
int[] a;
这条语句
只声明了变量a,并没有将a初始化为一个真正的数组.应该使用 new 运算符创建数组:
int[] a = new int[100];
这条语句创建了一个可以存储100个整数的数组.
要想 获得数组中的元素个数,可以使用array.length.例如
for (int i = 0; i < a.length; i++)
System.out.print(a[i]);
3.10.1 for each 循环
Java有一个功能很强的循环结构,可以用来依次处理数组中的每个元素而不必为指定下标值而分心. 这种增强的 for 循环的语句格式为:for (variable : collection)
statement;
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句.collection这一集合表达式必须是一个数组或实现了Iterable接口的类对象.
例如,
for (int element : a)
System.out.println(element);
打印数组a的每一个元素.
这种循环读作"循环a中的每一个元素"(for each element in a).
传统的 for 循环也可以获得同样的效果:
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
3.10.2 数组初始化以及匿名数组
在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写方式.如下所示:int[] smallPrimes = {2, 3, 5, 1};
注意,在使用这种语句时,不需要调用 new .
甚至还可以初始化一个匿名的数组:
new int[] {1, 3, 5, 7}
这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数.使用这种语法形式可以在不创建变量的情况下重新初始化一个数组.例如:
smallPrimes = new int[] {1, 3, 5, 7};
这是下列语句的简写形式:int[] anonymous = {1, 3, 5, 7};
smallPrimes = anonymous;
注释:在Java中,允许数组长度为0.下面这条语句创建一个长度为0的数组:
new elementType[0];
3.10.3 数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量.这时,两个变量将引用同一个数组:int[] luckyNumbers = smallPrimes;
luckyNumbers[3] = 2; // now smallPrimes[2] is also 2
如果希望将一个数组额所有值拷贝到一个新的数组中去,就要使用Arrays类的copyTo方法:
int[] copiedLuckyNumbers = Arrays.copyTo(luckyNumbers, luckyNumbers.length):
第2个参数是新数组的长度,这个方法通常用来增加数组的大小.
luckyNumbers = Arrays.copyTo(luckyNumbers, 2 * luckyNumbers.length);
如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为 false .相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素.
注释: Java数组与C++数组在堆栈上有很大不同,但基本上与分配在堆上的数组指针一样,也就是说,
int[] a = new int[100]; // Java
不同于
int a[100]; // C++
而等同于
int* a = new int[100]; // C++
Java中的[]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过a+1 得到数组的下一个元素.
3.10.4 命令行参数
前面已经看到多个使用Java数组的示例,每一个Java应用程序都有一个带String arg[]参数的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.println("!");
}
}
如果使用下面这种形式运行这个程序:
Java Message -g cruel world
args数组将包含下列内容:
args[0]: "-g"
args[1]: "cruel"
args[2]: "world"
这个程序将显示下列信息:
Goodbye, cruel world!
注释:在Java应用程序的main方法中,程序名并没有存储在args数组中,例如,当使用下列命令运行程序时
java Message -h world
args[0]是"-h",而不是"Message"或"Java".
3.10.5 数组排序
要想对数值型数组进行排序,可以使用Arrays类中的sort方法:int[] a = new int[1000];
...
Arrays.sort(a);
这个方法使用了优化的快速排序算法.
下面这个程序用到了数组,它产生一个抽采游戏中的随机数值组合.
<pre name="code" class="java">import java.util.*;
public class LotteryDrawing
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("how many numbers do you need to draw?");
int k = in.nextInt();
System.out.print("what is the highest numbers you can draw?");
int n = in.nextInt();
// fill an array with numbers 1 2 3 ... n
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers[i] = i + 1;
// draw k numbers and put them into a second array
int[] result = new int[k];
for (int i = 0; i < result.length; i++)
{
// make a random index between 0 and n-1
int r = (int)(Math.random() * n);
// pick the element at the random location
result[i] = numbers[r];
// move the last element into the random location
numbers[r] = numbers[n - 1];
n--;
}
// print the sorted array
Arrays.sort(result);
System.out.println("Bet the following combination.It'll make you rick!");
for (int r : result)
System.out.println(r);
}
}
注意,抽取出来的数字是不能重复的.
Java.util.Arrays的方法:
static String toString(type[] a)
返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔
参数: a 类型为 int,short,long,double,float,char,byte,boolean的数组
static type copyOf(type[] a, int length)
static type copyOf(type[] a, int start, int end)
返回与a类型相同的一个数组,其长度为length或end-start,数组元素为a的值
参数: a 类型为...的数组
start 起始下标(包含这个值)
end 终止下标(不包含这个值),这个值可能大于a.length.此时,结果为0或false
length 拷贝的数据元素长度.
static void sort(type[] a)
采取优化的快速排序算法对数组进行排序
static int binarySearch(type[] a, type v)
static int binarySearch(type[] a, int start, int end, type v)
采取二分查找算法查找值v
static void fill(type[] a, type v)
将数组的所有数据元素值设置为v
static boolean equals(type[] a, type[] b)
如果两个数组大小相同,并且下标相同的元素都对应相等,返回 true .