1 数组的特殊性

数组与其他持有对象的容器之间有三方面区别:效率、类型和保存基本类型的能力。

  • 效率:数组是Java中效率最高的存储和随机访问对象引用序列方式。这是一个简单的线性序列,使得元素访问非常快速,但是缺陷在于数组大小不可变。
  • 类型:数组中元素类型一致。
  • 保存基本类型:数组可以保持基本数据类型,而容器不可以,只能使用自动包装之后的数据类型。

    2 数组的分类

    2.1 按维度分类

  • 一维数组

int[] a = new int[10];

  • 多维数组

创建方式一:常用于基本类型数组,int[][] a = { {1, 2, 3}, {4, 5, 6}};
创建方式二:使用new分配数组,int[][][] a = new int[2][2][4];。基本类型数组的值在不进行显示定义的情况下会自动初始化,对象数组会被初始化为null。

2.2 按数据类型分类

2.2.1 基本类型数组

int[] a = new int[10];

2.2.2 对象数组

ClassName[] a = new ClassName[10];

3 数组的基本应用

大部分情况下还是更加倾向于选择容器。在具有特殊要求的场景下,由于数据具有高效性,此时会选择使用数组。
数组标识符只是个引用,指向堆中创建的一个真实对象。这个对象用于保存指向其他对象的引用。
使用[]读取数组的元素。

4 数组作为返回值

虽然在C/C++中,返回一个数组是不可行的,但是在Java中可以直接返回一个数组,只要代码中还在使用,这个数组就一直存在,直到使用完,垃圾回收器清理掉它。

  1. public static String[] f(int n){
  2. String[] result = new String(n);
  3. for(int i = 0; i < n; i++){
  4. result[i] = i;
  5. }
  6. return result;
  7. }

5 数组与泛型

数组和泛型结合较差,不能实例化具有参数类型的数组。这在泛型里面会详细涉及。

6 使用数组创建测试数据

6.1 Array.fill()

Java标准库中,Arrays类有一个fill()方法:只能用同一个值填充所有位置。

  1. int[] a = new int[10];
  2. Arrays.fill(a, 80);
  3. System.out.println(Arrays.toString(a));
  4. /*
  5. Output:
  6. [80, 80, 80, 80, 80, 80, 80, 80, 80, 80]
  7. */

6.2 数据生成器


6.3 从Generator中创建数组


7 Array类的实用功能

java.util库中存在Array类,实现了一套用于数组的static方法,包含了六个基本方法:

  • equals()用于比较数组是否相等,deepEquals()用于比较多维数组
  • fill()填充数组
  • sort()数组排序
  • binarySearch()已排序的数组进行查找
  • toString()产生数组的String表示
  • hashCode()产生数组的散列码

这些方法对基本数据类型和Object类都进行了重载;Arrays.asList()接受任何序列或数组作为参数,将其转换为List

7.1 复制数组

Java标准类库提供的static方法System.arraycopy(),该方法针对所有类型都进行了重载,复制数组的效率高于for循环。
System.arraycopy(ClassName1[] a, int idx, ClassName2[] b, int idy, int num);
a是源数组,idx是开始复制的位置下标,b是目标数组,idy是开始保存的位置下标,num是复制的元素个数。

7.2 数组比较

Arrays类型提供了equals()方法,数组的元素个数必须相同,每个位置的元素内容也必须相同。对每个位置元素使用该元素的equals进行比较判断。deepEquals()用于比较多维数组。

7.3 数组元素比较

7.3.1 实现java.lang.Comparable接口

该接口只有一个方法,compareTo(),用于接收另一个Object为参数,若当前对象小于参数则返回负值,若等于则返回0,若大于则返回正值。

  1. class ClassA implements Comparable<ClassA>{
  2. int i;
  3. public int compareTo(ClassA rv){
  4. return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
  5. }
  6. }

7.3.2 实现Comparator接口

该接口的类包含两个方法:compare()equals()equals()方法已经实现好了,如果不够用有特别需要,可以自定义实现compare()
Collection.reverseOrder()返回一个反向排序的Comparator接口类。

  1. class CompTypeComparator implements Comparator<ClassA>{
  2. public int compare(ClassA a1, ClassA a2){
  3. return (a1.i < a2.i ? -1 : (a1.i == a2.i ? 0 :1));
  4. }
  5. }
  6. public class ComparatorTest{
  7. public static void main(String[] args){
  8. ClassA[] a = new ClassA[10];
  9. ...
  10. Arrays.sort(a, new CompTypeComparator());
  11. }
  12. }

7.4 数组排序

Arrays.sort(ClassName1[] a, Collections.reverseOrder()); 数排序从大到小
Arrays.sort(ClassName1[] a, String.CASE_INSENSITIVE_ORDER); 字符串排序,按照字典序,默认不设置是区分大小写,大写先排,这里设置的意思是,忽略大小写。

7.5 已排序数组查找

**Arrays.binarySearch(ClassName1[] a, ClassName1 item)**
要求是排序完成的数组,否则会产生难以预料的结果。
找到了返回非负数,否则返回负值,这个负值为如果要插入该元素,应该放置的下标。