零基础学Java(8)数组
数组
数组存储相同类型值的序列。
声明数组
数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标(index,或称索引)可以访问数组中的每一个值。例如,如果a是一个整型数组,a就是数组中下标为i的整数。
在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。下面声明了整型数组a:
[backcolor=rgba(255, 255, 255, 0.9)]不过,这条语句只声明了变量a,并没有将a初始化为一个真正的数组。应该使用new[backcolor=rgba(255, 255, 255, 0.9)]操作符创建数组
[backcolor=rgba(255, 255, 255, 0.9)]这条语句声明并初始化了一个可以存储100个整数的数组。
数组长度不要求是常量:new int[n]会创建一个长度为n的数组。
一旦创建了数组,就不能再改变它的长度。如果程序运行中需要经常扩展数组的大小,就应该使用另一种数据结构---数组列表(array list)
[backcolor=rgba(255, 255, 255, 0.9)]在Java中,提供了一种创建数组对象并同时提供初始值的简写形式。如下: - int[] a = {2, 3, 5, 7, 11, 13};
复制代码[backcolor=rgba(255, 255, 255, 0.9)]请注意,这个语法不需要使用new,甚至不用指定长度。
最后一个值后面允许有逗号,如果你要不断为数组增加值,这会很方便: - String[] authors = {"James", "Kobe", "Curry", "Durant",};
复制代码[backcolor=rgba(255, 255, 255, 0.9)]当然,我们也可以声明一个匿名数组; - new int[] {17, 19, 23, 29, 31, 37}
复制代码[backcolor=rgba(255, 255, 255, 0.9)]这会分配一个新数组并填入大括号中提供的值。它会统计初始值的个数,并相应地设置数组大小。可以使用这种语法重新初始化一个数组而无须创建新变量。例如: - smallPrimes = new int [] {17, 19, 23, 29, 31, 37};
复制代码[backcolor=rgba(255, 255, 255, 0.9)]注意
在Java中,允许有长度为0的数组。在编写一个结果为数组的方发时,如果碰巧结果为空,这样一个长度为0的数组就很有用。可以如下创建长度为0的数组: - new elementType[0];
- 或
- new elementType2[] {};
复制代码[backcolor=rgba(255, 255, 255, 0.9)]访问数组 [backcolor=rgba(255, 255, 255, 0.9)]前面的数组元素的下标为从0~99(不是1~100)。一旦创建了数组,就可以在数组中填入元素,例如,使用一个循环: - int[] a = new int[100];
- for (int i = 0; i < 100; i++) {
- a[i] = i;
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]创建一个数字数组时,所有元素都初始化为0,boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,表示这些元素还未存放任何对象。刚开始我们可能有些不了解,例如: - String[] names = new String[10];
复制代码[backcolor=rgba(255, 255, 255, 0.9)]我们会创建一个包含10个字符串的数组,所有字符串都为null。如果希望这个数组包含空串,必须为元素指定空串: - for (int i=0; i < 10; i++) names[i] = "";
复制代码[backcolor=rgba(255, 255, 255, 0.9)]注意:如果创建了一个100个元素的数组,并且试图访问元素a[100](或在0~99之间的任何下标),就会引发array index out of bounds异常。
如果我们想获得数组中的元素个数,可以使用array.length。例如: - for (int i=0; i<a.length; i++) {
- System.out.println(a[i]);
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]for each循环 [backcolor=rgba(255, 255, 255, 0.9)]Java有一种功能很强的循环结构,可以用来依次处理数组(或者其他元素集合)中的每个元素,而不必考虑指定下标值。这种增强的for循环的语句格式为: - for (variable: collection) statement
复制代码[backcolor=rgba(255, 255, 255, 0.9)]它定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(当然,也可以是语句块)。collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(例如ArrayList),例如: - int[] a = {2, 3, 4, 5, 6};
- for (int element: a) {
- System.out.println(element);
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]打印数组a的每一个元素,一个元素占一行。 [backcolor=rgba(255, 255, 255, 0.9)]这个循环应该读作"循环a中的每一个元素"(for each element in a)。当然,使用传统的for循环也可以获得同样的效果: - for (int i = 0;i < a.length; i++) {
- System.out.println(a[i]);
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]但是,for each循环语句显得更加简洁、更不易出错,因为你不必为下标的起始值和终止值而操心。
for each循环语句的循环变量将会遍历数组中的每个元素,而不是下标值
总结:如果需要处理一个集合中的所有元素,for each循环语句相对于传统循环语句所做的改进很让人欣喜。然而,很多情况下还是需要使用传统的for循环。例如,如果不希望变量整个集合,或者在循环内部需要使用下标值时。
数组拷贝[backcolor=rgba(255, 255, 255, 0.9)]在Java中,允许将一个数组变量拷贝到另一个数组变量。这时,两个变量将引用同一个数组: - public class SevenSample {
- public static void main(String[] args) {
- int[] smallPrimes = {2, 3, 4, 5, 6, 7, 8};
- // 拷贝smallPrimes
- int[] luckyNumbers = smallPrimes;
- System.out.println(Arrays.toString(luckyNumbers));
- }
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]结果 [backcolor=rgba(255, 255, 255, 0.9)]下图显示了拷贝的结果。 [backcolor=rgba(255, 255, 255, 0.9)] [backcolor=rgba(255, 255, 255, 0.9)]如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法: - import java.util.Arrays;
- public class SevenSample {
- public static void main(String[] args) {
- int[] smallPrimes = {2, 3, 4, 5, 6, 7};
- int[] copiedLuckyNumbers = Arrays.copyOf(smallPrimes, smallPrimes.length);
- System.out.println(Arrays.toString(copiedLuckyNumbers));
- }
- }
复制代码[backcolor=rgba(255, 255, 255, 0.9)]结果如下: [backcolor=rgba(255, 255, 255, 0.9)]Array.copyOf方法中,第1个参数是拷贝的对象,第2个参数是新数组的长度。这个方法通常用来增加数组的大小: - luckNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);
复制代码[backcolor=rgba(255, 255, 255, 0.9)]①如果数组元素是数值型,那么额外的元素将被赋值为0; [backcolor=rgba(255, 255, 255, 0.9)] [backcolor=rgba(255, 255, 255, 0.9)]②如果数组元素是布尔值,那么额外的元素将被赋值为false。 [backcolor=rgba(255, 255, 255, 0.9)] [backcolor=rgba(255, 255, 255, 0.9)]③如果长度小于原始数组的长度,则只拷贝前面的值 [backcolor=rgba(255, 255, 255, 0.9)]
|