数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列,数组是通过方括号下标操作符[]来定义和使用的,要定义一个数组,只需在类型名后面加上一对方括号即可:

                int[] a;

方括号也可置于标识符后面:

                int a[];

    数组也是保存对象的方式之一,数组与其它种类的容器之间的主要区别有三个方面:效率、类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,使得元素访问非常快速,但是也损失了一些其他特性。

    当创建了一个数组对象时(将数组本身看作对象),数组的大小就被固定了,并且这个数组的生命周期也是不可改变的。如果创建的数组空间不足时,通常是再创建一个新的数组,然后将旧数组中的所有引用移到新数组中。在Java中,无论使用数组或容器,都会有边界检查,如果操作越界,就会得到一个RuntimeException异常。

    数组是第一级对象:

    无论使用哪一种类型的数组,数组标识符其实就是一个引用,指向在堆中创建的一个真实对象,这个数组对象用以保存指向其他对象的引用。“[]”语法是访问数组对象的唯一的方式。

    对象数组和基本类型数组在使用方式上几乎是相同的,唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。

    Arrays类:

    Arrays类有一套static方法,提供了操作数组的使用功能。其中有四个基本方法:equals()用于比较两个数组是否相等;fill()方法用于以某个值填充整个数组,但是只能以某个单一的值来填充整个数组;sort()方法用于对数组排序;binarySearch()用于在已经排序的数组中查找元素。此外,asList()方法用于接收任意的数组为参数,并将其转换成List容器。

    数组的复制:用Java标注类库中的System.arraycopy()方法比用for循环快得多。其参数有:原数组、表示从原数组中的什么位置开始复制的偏移量,表示从目标数组的什么位置开始复制的偏移量,以及需要复制的元素的个数。对数组的任何越界的操作都会导致异常。

    数组的比较:Arrays类提供了重载后的equals()方法用来比较整个数组,数组相等的条件是元素个数必须相等,并且对应位置的元素也必须相等。(对于基本类型,需要使用基本类型的包装器类的equals()方法,例如:对于int类型使用Integer.equals()来比较)。

    数组元素的比较:Java有两种方式来提供比较功能。第一种是实现java.lang.Comparable接口,使类具有“天生的”比较能力,此接口只有一个compareTo()方法,此方法要以另一个Object为参数,如果当前对象小于参数则返回负值,如果相等则返回0,如果当前对象大于参数则返回正值。                另一种方法是使用策略设计模式,通过使用策略,将会发生变化的代码封装在他自己的类中(即策略对象)。将策略对象交给保持不变的代码,后者使用此策略实现它的算法。就是说,可以为不同的比较方式生成不同的对象,将他们用在同样的排序程序中。此处,可以通过定义一个实现了Comparator接口的类而创建了一个策略,这个类有compare()和euqals()方法,此处不一定需要实现equals()方法,除非有特殊的性能需求,因为无论何时创建一个类,都是间接继承自Object,而Object自带有equals方法。compare()方法返回负整数,零或正整数,分别对应于第一个参数小于、等于或大于第二个参数。

    数组排序:使用内置的排序方法,就可以对任意的基本类型数组排序;也可以对任意的对象数组进行排序,只要个该对象实现了Comparable接口或具有相关联的Comparator。

    在已经排序的数组中查找:如果数组已经排序完成,就可以使用Arrays.binarySearch()执行快速查找,不能对未排序的数组执行binarySearch(),否则会产生不可预料的结果。如果找到了目标,方法会产生一个大于或者等于0的值,表示该元素的位置。否则返回一个负值,表示如果保持数组的排序状态,此目标所应该插入的位置。这个值的计算方式是:-(插入点)-1