概述
所谓数组,是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
一维数组
声明数组
第一种方式
first 1
double[] myList; //dataType[] arrayRefVar,首选的方法
第二种方式
second 1
double myList[]; //dataType arrayRefVar[],效果相同,但不是首选方法
建议使用 dataType[] arrayRefVar的声明风格声明数组变量。 dataType[] arrayRefVar风格是来自 C/C++语言 ,在Java中采用是为了让C/C++程序员能够快速理解java语言。
创建数组
1 | arrayRefVar = new dataType[arraySize]; |
上面的语法语句做了两件事:
- 使用 dataType[arraySize]创建了一个数组
- 把新创建的数组的引用赋值给变量 arrayRefVar
数组变量的声明和创建数组可以用一条语句完成
- 第一种方式
first 1
dataType[] arrayRefVar = new dataType[arraySize];
这种方式直接在创建数组时给定了数组的长度:arraySize
- 第二种方式
second 1
dataType[] arrayRefVar = {value0, value1, ..., valuek};
这种方式直接在创建数组时赋值:value0, value1, …, valuek
- 第三种方式
third 1
dataType[] arrayRefVar = new dataType[]{value0, value1, ..., valuek};
这种方式是在第二种方式的=后面补全:new dataType[]
数组访问方式
数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayRefVar.length-1
语法:
- 数组名[索引]
数组元素分配的初始值
数组元素类型 | 默认初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | ‘\u0000’ |
boolean | false |
引用数据类型 | null |
实例
1 | public class TestArray { |
- 运行结果
1 | 总和为: 11367.373 |
图示
- 下面的图片描绘了数组 myList
- myList 数组里有 10 个 double 元素,它的下标从 0 到 9
遍历数组
采用for循环来遍历数组
1 | public class TestArray { |
- 运行结果
1 | 1.9 |
在需要获取元素下标时使用该方法
采用foreach循环来遍历数组
1 | public class TestArray { |
- 运行结果
1 | 1.9 |
在JDK 1.5 引进
被称为foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
常用方法
计算总和
1 | public class TestArray { |
- 运行结果
1 | Total is 11.7 |
查找最大元素
1 | public class TestArray { |
- 运行结果
1 | Max is 3.5 |
传参遍历数组
1 | public static void printArray(int[] array) { |
- 调用函数
1 | printArray(new int[]{3, 1, 2, 6, 4, 2}); |
- 运行结果
1 | 3 1 2 6 4 2 |
数组倒排
1 | public static int[] reverse(int[] list) { |
- 调用函数
1 | printArray(reverse(new int[]{1,2,3,4,5,6})); |
- 运行结果
1 | 6 5 4 3 2 1 |
数组和字符串的转换
1 | public class Test { |
- 运行结果
1 | helloworld |
java.util.Arrays类操作数组
java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。具有以下功能:
- 给数组赋值:通过fill方法。
- 对数组排序:通过sort方法,按升序。
- 比较数组:通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
方法 | 说明 |
---|---|
public static int binarySearch(Object[] a, Object key) | 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1) |
public static boolean equals(long[] a, long[] a2) | 如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等) |
public static void fill(int[] a, int val) | 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等) |
public static void sort(Object[] a) | 对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等) |
1 | import java.util.Arrays; |
- 运行结果
1 | 填充数组:Arrays.fill(array, 5): |
Arrays.copyOf()进行扩容
Array.copy(E[] e,newLength);
其第一个形参指的是需要扩容的数组,后面是扩容后的大小,其内部实现其实是使用了 System.arrayCopy(); 在内部重新创建一个长度为 newLength 类型是 E 的数组。
1 | import java.util.Arrays; |
- 运行结果
1 | 10 20 30 40 50 0 //默认补 0 |
数组小游戏
程序随机产生5个按一定顺序排列的字符,作为猜测结果。
玩家可以猜测多次,每猜一次,若猜测的完全正确则游戏结束,并计算玩家的游戏得分并输出。若没有猜对,则提示猜测结果,如猜对了几个字符,以及猜对了几个字符的位置信息,并提示玩家游戏继续。若中途输入EXIT,则游戏提前结束
1 | import java.util.Scanner; |
- 运行结果
小游戏可以自行尝试啦,没有固定结果
数组越界异常
当数组的长度为固定值,操作索引>=数组的长度,就会报数组越界异常
1 | public class Main { |
- 运行结果
1 | Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 |
此案例中,数组长度为2,在i[2]添加数据就会报数据越界异常错误
数组基本封装类
为数组而写的封装类,提供了创建,增,删,改,查(索引,二分法)等实用功能
1 | public class MyOrderArray { |
- 调用类
1 | public class TestMyArray { |
- 运行结果
1 | [13 34 90 ] |
在项目中导入该包装类,对于数组操作来言,将是如虎添翼
多维数组
概述
Java中定义和操作多维数组的语法与一维数组类似。在实际应用中,三维及以上的数组很少使用,主要使用二维数组。
二维数组
二维数组可以理解为在一维数组中嵌套一维数组使之成为二维数组,可以看成是数组的数组
语法:
- 数组类型 [][] 数组名;
- 数组类型 数组 [][];
- 需要强调的是,虽然从语法上看,Java支持多维数组,但从内存分配原理的角度讲,Java中只有一维数组,没有多维数组。或者说,表面上是多维数组,实质上都是一维数组。
初始化
- 直接为每一维分配空间
1 | type[][] arrayName = new type[arraylenght1][arraylenght2]; |
type 可以为基本数据类型和复合数据类型,arraylenght1 和 arraylenght2 必须为正整数,arraylenght1 为行数,arraylenght2 为列数。
- 如:
初始化的额外说明
- 可以只对部分元素赋初值,未赋初值的元素自动取0值
- 如对全部元素赋初值,则第一维的长度可以不给出
二维数组的引用
- 对二维数组中的每个元素,引用方式为 arrayName[index1][index2]
1 | num[1][0]; |
二维数组的空间分布
- 我们用int a[4][4]举例
- 说明了一个四行四列的数组,数组名为a,其下标变量的类型为整型,该数组的下标变量共有4×4个
第一列 | 第二列 | 第三列 | 第四列 |
---|---|---|---|
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
a[3][0] | a[3][1] | a[3][2] | a[3][3] |
二维数组的遍历
public static void main(String[] args){
int [][] array=new int[][]{{90,32,43,43,23},{42,32,44},{67}};
int total;
for(int i=0;i<array.length;i++){
String str=(i+1)+"班";
total=0;
for(int j=0;j<array[i].length;j++){
total+=array[i][j];
}
System.out.println(str+"总成绩:"+total);
}
}
- 运行结果
1 | 1班总成绩:231 |
总结
- 数组是可以再内存中连续存储多个元素的结构。数组中的所有元素必须属于相同的数据类型。
- 数组中的元素通过数组下标进行访问,数组下标从0开始。
- 二维数组实际上是一个一维数组,它的每个元素又是一个一维数组。
- 使用Array类提供的方法可以方便地对数组中的元素进行排序、查询等操作。
- JDK1.5之后提供了增强for循环,可以用来实现对数组和集合中数据的访问。