简介
在Java中,有一种数据结构叫做数组,它用来存储同一类型的值的集合。通过一个整型下标可以访问数组中的每一个值。例如,如果a是一个整型数组,那么a[i]就是数组中下标为i的整数。
创建一个数组的方法
首先,我们可以声明一个数组,声明一个数组有两种方法:
int[] a;
int a[];
当然,一般情况下我们更喜欢使用第一种方式来声明一个数组,因为它将类型与变量名分开,优化了代码的可读性。
刚刚我们只是声明了一个数组a,但是并没有将a初始化为一个真正的数组,我们应该使用new运算符创建数组:
int[] a = new int[100];
这里我们就创建了一个可以存储100个整型的数组,这里需要注意,数组的长度没有要求是一个常量,比如:new int[n]
会创建一个长度为n的数组。
数组的下标从0开始,而不是1,比如我们要访问上文数组a中的元素的话,则下标范围需要0~99之间,如果使用了范围之外的下标,就会抛出一个数组越界异常(array index out of bounds)。我们如果想要知道当前数组的长度,可以使用array.length
,比如:
//遍历数组的一种方式
for (int i = 0;i < a.length; i++) {
System.out.println(a[i])
}
当我们在创建一个数组的时候没有为这个数组初始化值,数字数组的所有元素会初始化为0,布尔数组的元素会初始化为false,对象数组的元素则被初始化为一个特殊值null,表示这些元素还没存放任何对象。一旦我们创建了一个数组,就不能改变它的大小。
数组的遍历可以使用上节中所讲的所有循环语句来进行遍历,其中最常用的是foreach,效率最高的是常规for循环。
数组初始化
在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写方式。如下所示:
int[] smallPrimes = {2, 3, 5, 7 ,11};
这里需要注意一点,如果在使用这种语句初始化一个数组的时候,不需要调用new。
甚至我们可以使用这种方式初始化一个匿名的数组:
new int[] {17, 19, 23, 29, 31, 37};
这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种方式可以在不创建新变量的情况下重新初始化一个数组。例如:
smallPrices = new int[] {17, 19, 23, 29, 31, 37};
//简写如下:
int[] anoymous = {17, 19, 23, 29, 31, 37};
smallPrices = anoymous;
在Java中,允许数组长度为0,但是这里需要注意一点,数组长度为0与null并不相同,不要将两者混淆。
数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组,例如:
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12 //这时smallPrimes[5]也是12
如果希望将一个数组中的所有值拷贝到另外一个数组中去,可以使用Arrays
类中的copyOf
方法:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);
第2个参数是新数组的长度,如果新数组的长度大于原始数组的长度,根据原始数组的数据类型初始化为对应的初始值,如果新数组的长度小于原数组的长度,则会只拷贝最前面的数据元素。
命令行参数
如果我们细心观察会发现,每一个Java程序都有一个带有String args[]参数的main方法,这个参数表示main方法将会接受一个字符串数组,也就是命令行参数。比如:
public class Message {
public static void main(String[] args) {
if (args.length == 0 || args[0].equals("-h")) {
System.out.println("Hello,");
} else if (args[0].equals("-g")){
System.out.println("GoodBye,");
}
for (int i = 1; i < args.length; i++) {
System.out.println(" " + args[i]);
}
System.out.println("!");
}
}
如果我们在当前目录命令行分别输入java Message -g Vi-Young Space
和java Message -h Vi-Young Space
会分别输出以下结果:
GoodBye,
Vi-Young
Space
!
Hello,
Vi-Young
Space
!
数组排序
要是想对数值型数组进行排序,我们可以使用Arrays类中的sort
方法
int[] a = new int[10000];
...
Arrays.sort(a);
这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的。
Arrays-Api
Tables | Are | Cool |
---|---|---|
toString(T[] a) |
String | 返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔 |
copyOf(T[] a, int length) |
T[] | 返回a类型相同的一个数组,参数length为拷贝的数组长度 |
copyOfRange(T[] a, int start,int end) |
T[] | 返回与a类型相同的一个数组,数组从下标为start处开始拷贝,到end处(不包括end)截止 |
sort(T[] a) |
void | 采用优化的快速排序算法对数组进行排序 |
binarySearch(T[] a, T v) |
int | 采用二分查找法在a中寻找值v,如果查找成功,则返回相应的下标值,否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置 |
binarySearch(T[] a, int start, int end, T v) |
int | 采用二分查找法在a的start(包括)和end(不包括)之间寻找值v,如果查找成功,则返回相应的下标值,否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置 |
fill(T a, T v) |
void | 将数组的所有数据元素值设置为v |
equals(T a, T b) |
boolean | 如果两个数组大小相同,且下标相同的元素都对应相等,返回true |
下节预告
类
公众号
扫码或微信搜索Vi的技术博客,关注公众号,不定期送书活动各种福利~