1. 数组的定义

数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
数组的三个基本特点:

  1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素必须是相同类型,不允许出现混合类型。
  3. 数组类型可以是任何数据类型,包括基本类型和引用类型。
    • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
    • 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的
    • 数组下标从 0 开始的

2. 数组的声明

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

  1. dataType[] arrayRefVar; // 首选的方法
  2. dataType arrayRefVar[]; // 效果相同,但不是首选方法

注意: 建议使用 dataType[] arrayRefVar 的声明风格声明数组变量。 dataType arrayRefVar[] 风格是来自C/C++语言 ,在Java中采用是为了让C/C++程序员能够快速理解 java 语言。

下面是这两种语法的代码示例:

  1. double[] myList; // 首选的方法
  2. double myList[]; // 效果相同,但不是首选方法

3. 数组的创建

Java 语言使用 new操作符来创建数组,
语法如下:

  1. arrayRefVar = new dataType[arraySize];

上面的语法语句做了两件事:

  • 一、new dataType[arraySize] 创建了一个数组。
  • 二、把新创建的数组的引用赋值给变量 arrayRefVar。

4. 数组初始化

数组的初始化方式总共有三种:

  • 静态初始化
  • 动态初始化
  • 默认初始化。

    静态初始化

    除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
    1. int[] a = { 1, 2, 3 };// 静态初始化基本类型数组;
    2. Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;

    动态初始化

    数组定义与为数组元素分配空间并赋值的操作分开进行。
    1. int[] a1 = new int[2];//动态初始化数组,先分配空间;
    2. a1[0]=1;//给数组元素赋值;
    3. a1[1]=2;//给数组元素赋值;

    数组的默认初始化

    数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
    1. int a2[] = new int[2]; // 默认值:0,0
    2. boolean[] b = new boolean[2]; // 默认值:false,false
    3. String[] s = new String[2]; // 默认值:null, null

5. 数组的访问

  1. 数组的元素是通过索引访问的。
  2. 数组索引从0开始,所以索引值从 0 到 arrayRefVar.length-1。

那么当数组开辟空间之后,就可以采用如下的方式的操作:

  • 数组的访问通过索引完成,即:”数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1。例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生 java.lang.ArrayIndexOutOfBoundsException 异常信息;
  • 当我们数组采用动态初始化开辟空间后,数组里面的每一个元素都是该数组对应数据类型的默认值;
  • 数组本身是一个有序的集合操作,所以对于数组的内容操作往往会采用循环的模式完成,数组是一个有限的数据集合,所以应该使用 for 循环。
  • 在 Java 中提供有一种动态取得数组长度的方式:数组名称.length;

    1. public static void arrayTest() {
    2. int data[] = new int[3]; //开辟了一个长度为3的数组
    3. data[0] = 10; // 第一个元素 赋值为10
    4. data[1] = 20; // 第二个元素 赋值为20
    5. data[2] = 30; // 第三个元素 赋值为30
    6. for(int index = 0; index < data.length; index++) {
    7. System.out.println(data[index]); //通过循环控制索引
    8. }
    9. }
    10. /**
    11. * Main()方法调用arrayTest()方法控制台打印
    12. * 10
    13. * 20
    14. * 30
    15. */

    6. foreach 循环

    JDK 1.5 引进了一种新的循环类型,被称为 foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
    语法格式如下:

    1. for(type element: array){
    2. System.out.println(element);
    3. }

    上个代码示例用 foreach 的写法如下:

    1. public static void foreachTest() {
    2. int data[] = new int[3]; //开辟了一个长度为3的数组
    3. data[0] = 10; // 第一个元素 赋值为10
    4. data[1] = 20; // 第二个元素 赋值为20
    5. data[2] = 30; // 第三个元素 赋值为30
    6. for (int datum : data) {
    7. System.out.println(datum); //通过循环控制索引
    8. }
    9. }

    7. Arrays类

    JDK提供的java.util.Arrays类,包含了常用的数组操作,方便我们日常开发。
    java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
    具有以下功能:

  • 给数组赋值:通过 fill 方法。

  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

具体说明请查看下表:

返回类型 方法 说明
String toString(array) 将数组array转换成字符串
void sort(array) 对数组进行升序排列
void fill(arr,val) 将数组arr全部元素赋值为val
boolean equals(arr1,arr2) 判断两个数组是否相等
与arr类型相同 copyOf(arr,length) 将数组arr复制成一个长度为length的新数组
int binarySearch(arr, val) 查询元素val在arr中的下标值