1. 数组的定义
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
数组的三个基本特点:
- 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组类型可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
- 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的
- 数组下标从 0 开始的
2. 数组的声明
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar; // 首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
注意: 建议使用 dataType[] arrayRefVar 的声明风格声明数组变量。 dataType arrayRefVar[] 风格是来自C/C++语言 ,在Java中采用是为了让C/C++程序员能够快速理解 java 语言。
下面是这两种语法的代码示例:
double[] myList; // 首选的方法
或
double myList[]; // 效果相同,但不是首选方法
3. 数组的创建
Java 语言使用 new操作符来创建数组,
语法如下:
arrayRefVar = new dataType[arraySize];
上面的语法语句做了两件事:
- 一、new dataType[arraySize] 创建了一个数组。
- 二、把新创建的数组的引用赋值给变量 arrayRefVar。
4. 数组初始化
数组的初始化方式总共有三种:
- 静态初始化
- 动态初始化
- 默认初始化。
静态初始化
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。int[] a = { 1, 2, 3 };// 静态初始化基本类型数组;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;
动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行。int[] a1 = new int[2];//动态初始化数组,先分配空间;
a1[0]=1;//给数组元素赋值;
a1[1]=2;//给数组元素赋值;
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。int a2[] = new int[2]; // 默认值:0,0
boolean[] b = new boolean[2]; // 默认值:false,false
String[] s = new String[2]; // 默认值:null, null
5. 数组的访问
- 数组的元素是通过索引访问的。
- 数组索引从0开始,所以索引值从 0 到 arrayRefVar.length-1。
那么当数组开辟空间之后,就可以采用如下的方式的操作:
- 数组的访问通过索引完成,即:”数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1。例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生 java.lang.ArrayIndexOutOfBoundsException 异常信息;
- 当我们数组采用动态初始化开辟空间后,数组里面的每一个元素都是该数组对应数据类型的默认值;
- 数组本身是一个有序的集合操作,所以对于数组的内容操作往往会采用循环的模式完成,数组是一个有限的数据集合,所以应该使用 for 循环。
在 Java 中提供有一种动态取得数组长度的方式:数组名称.length;
public static void arrayTest() {
int data[] = new int[3]; //开辟了一个长度为3的数组
data[0] = 10; // 第一个元素 赋值为10
data[1] = 20; // 第二个元素 赋值为20
data[2] = 30; // 第三个元素 赋值为30
for(int index = 0; index < data.length; index++) {
System.out.println(data[index]); //通过循环控制索引
}
}
/**
* Main()方法调用arrayTest()方法控制台打印
* 10
* 20
* 30
*/
6. foreach 循环
JDK 1.5 引进了一种新的循环类型,被称为 foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
语法格式如下:for(type element: array){
System.out.println(element);
}
上个代码示例用 foreach 的写法如下:
public static void foreachTest() {
int data[] = new int[3]; //开辟了一个长度为3的数组
data[0] = 10; // 第一个元素 赋值为10
data[1] = 20; // 第二个元素 赋值为20
data[2] = 30; // 第三个元素 赋值为30
for (int datum : data) {
System.out.println(datum); //通过循环控制索引
}
}
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中的下标值 |