Java数组

数组定义

数组是一种数据结构, 用来存储同一类型值的集合。通过一个整型下标可以访问数组中
的每一个值。例如, 如果 a 是一个整型数组, a[i] 就是数组中下标为 i 的整数。Java的数组和其他语言没什么两样的。在 Java 中,使用数组存储和随机访问对象引用序列是非常高效的。数组是简单的线性序列,这使得对元素的访问变得非常快。然而这种高速也是有代价的,代价就是数组对象的大小是固定的,且在该数组的生存期内不能更改,所以一旦创建了数组, 就不能再改变它的大小(尽管可以改变每一个数组元素)0 如果经常需
要在运行过程中扩展数组的大小, 就应该使用另一种数据结构—数组列表( ArrayList)。数组和 ArrayList 之间的相似是设计者有意为之,所以在概念上,两者很容易切换。但是就像你在集合中看到的,集合的功能明显多于数组。随着 Java 自动装箱技术的出现,通过集合使用基本数据类型几乎和通过数组一样简单。数组唯一剩下的优势就是效率。然而,当你解决一个更加普遍的问题时,数组可能限制太多,这种情形下,就可以使用集合类,ArrayList容后再讲。

数组的创建

在声明数组变量时,需要指出数组类型 ( 数据元素类型紧跟[]) 和数组变量的名字。比如声明了整型数组 a:int[] a; 但是这只是声明了一个数组,没有任何关于数据的信息。你还要初始化数组。初始化数组就使用new:int[] a = new int[100];//了一个可以存储 100 个整数的数组,所有元素都初始化为 0。当然某些情况也可以省略new,可以在声明数组时初始化数组int[] array = { 1, 2, 3, 4 }; 这其实时一种缩写int[] array1 = new int[] { 1, 2, 3, 4 }; 你甚至还可以初始化一个匿名的数组:new int[] { 1, 2, 3, 4 };前面就是创建了一个匿名数组,并复制给了array.这里都是整数数组,其实还有字符数组,对象数组(String[])之类。

可以使用下面两种形式声明数组
int[] a;或int a[];
大多数 Java 应用程序员喜欢使用第一种风格, 因为它将类型 int[] ( 整型数组)与变量名分开了。

数组遍历

把数组的遍历单独提出来,有两种基本的遍历方式。第一种就是传统的循环,首先要得到数组的长度。长度可以使用 array.length得到。那么遍历就是这样子:

for (int i = 0; i < a.length; i ++)
        System.out.println(a[i]);
复制代码

第二种,Java 有一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元
素集合亦可)而不必为指定下标值而分心。foreach,增强的for结构。for (variable : collection) statement// 定义一个变量variable用于暂存集合中的每一个元素, 并执行相应的语句(当然,也可以是语句块)。collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象(以后再说这是啥,不懂先百度)。这个循环应该读作“ 循环collection中的每一个元素”(for each element in collection).

在 Java 中, 允许数组长度为 0。在编写一个结果为数组的方法时, 如果碰巧结果
为空, 则这种语法形式就显得非常有用。此时可以创建一个长度为 0 的数组:
new elementType[0]
注意, 数组长度为 0 与 null 不同。

数组拷贝

在 Java 中,允许将一个数组变量拷贝给另一个数组变量。这时, 两个变量将引用同一个数组。大概就是这样:

ntD anonymous = { 17, 19, 23, 29, 31, 37 };
smallPrimes = anonymous;
smallPrimes[1] = 19;
anonymous[1] = 19;
复制代码

但是。 如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用 Arrays 类的 copyOf 方法:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers , luckyNumbers .length);
第 2 个参数是新数组的长度。这个方法通常用来增加数组的大小:
luckyNumbers = Arrays.copyOf(luckyNumbers , 2 * luckyNumbers.length);
如果数组元素是数值型,那么多余的元素将被赋值为 0 ; 如果数组元素是布尔型,则将赋值
为 false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。

数组方法

数组的方法很多,有几个常用的:

static String toString(type[]a);//返回包含 a 中数据元素的字符串, 这些数据元素被放在括号内, 并用逗号分隔。

static type copyOf(type[]a, int length);//前面有

static type copyOfRange(type[]a , int start, int end);//返回与 a 类型相同的一个数组, 其长度为 length(end-start > length) 或者 end-start, 数组元素为 a 的值。

static void sort(type[] a)采用优化的快速排序算法对数组进行排序

static int binarySearch(type[]a, int start, int end, type v);//采用二分搜索算法查找值 v。如果查找成功, 则返回相应的下标值; 否则, 返回一个负数值r. -r-1 是为保持 a 有序 v 应插入的位置.[start 起始下标(包含这个值)。end 终止下标(不包含这个值)。也可以不写,就是整个数组]

static void fi11(type[] a , type v);//将数组的所有数据元素值设置为 V。

static boolean equals(type[]a, type[]b);//如果两个数组大小相同, 并且下标相同的元素都对应相等, 返回 true.

static void fill(type[] a, int v);//将数组所有元素设为v(不一定是int)

static boolean equals(type[] a, type[] b);//如果两个数组大小相同,且下标相同的元素都对应相等,返回true

还有一些其他方法,自己可以去查,不记录在这里了。

数组排序

数组的排序,就是使用 Arrays 类中的 sort 方法。全天下的排序函数都叫 sort.使用方法很简单,把数组名字放进去就行了。

多维数组

在 Java 中, 声明一个二维数组相当简单。例如:double[][] balances;与一维数组一样, 在调用 new 对多维数组进行初始化之前不能使用它。 在这里就这样初始化:
double[][] balances = new double[5][5];
另外, 如果知道数组元素, 就可以不调用 new, 而直接使用简化的书写形式对多维数组
进行初始化。例如:
int[][] magicSquare = { {16, 3, 2, 13}, {5, 10, 11, 8}, (9, 6, 7, 12}, {4, 15, 14, 1} };
一旦数组被初始化, 就可以利用两个方括号访问每个元素, 例如, balances[i][j]。

遍历二维数组

我们遍历数组总要做点事,暂且当作打印数据。
第一种方法:

            for (int j = 0; j < balances[i].length; j++) {
                 System.out.println(balances[i][j]);
            }
        }
复制代码

第二种方法:

for (double[] row : a)//循环一维
    for (double value : row)
        do something with value
复制代码

要想快速地打印一个二维数组的数据元素列表, 可以调用:System.out.println(Arrays.deepToString(a));