数组是具有相同数据类型的一组数据的集合,在Java中,虽然基本数据类型不是对象,但是由基本数据类型组成的数组却可以看成对象。数组作为对象允许使用new关键字进行内存分配,在使用数组前,必须首先定义数组的数据类型。
- 数组的创建
数组分一维数组和二维数组;
一维数组
一维数组的创建有两种形式:第一种,先声明数组,再用new来进行内存分配;第二种,声明数组与内存分配同时进行。
先声明数组,再用new来进行内存分配
首先声明一维数组同样有两种方式:
数组元素类型 数组名称 [];
数组元素类型 [] 数组名称;
数组声明后还不可以使用,要在为数组分配内存,要注意,在为数组分配内存空间时要指明数组的长度。
数组名称 = new 数组的元素类型[数组元素的个数];
注意:在为数组分配内存时,整数型数组的各个元素的初始值为0.
声明数组的同时为数组分配内存空间
数组元素类型 数组名称 = new 数组元素类型[数组元素的个数];
数组与基本数据类型一样可以进行初始化操作,可以分别初始化数组中的每个元素。
数组初始化的方式也有两种:
例如:int arr[] = new int[]{1,2,3,4,5};
Int arr[] = {3,5,7};
二维数组
二维数组就是数组中的每一个元素同样也是一个数组。二维数组通常用于表示表,表中信息以行列的形式组织,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
创建二维数组的方式同样有两种:先声明数组再分配内存和声明的同时进行内存分配;
声明二维数组
数组元素类型 数组名称 [] [];
数组元素类型 [] [] 数组名称;
为数组分配内存
arr = new int[2][4];
声明数组的同时为其分配内存:
数组元素类型 [][] 数组名称 = new 数组元素类型[2][4];
二维数组的初始化
例如: int arr[][] = {{1,2},{3,4}}
二.数组的操作
数组可以通过Java.util 包中的Arrays类包含的方法来对数组进行操作。
- 遍历数组
遍历数组,获取数组中的元素,通常采用for循环和foreach语句的方式,二维数组则需要双重for循环;
例如:// 首先定义一个二维数组
int arr [][] = new int[][] {{1},{2,3},{4,5,6}};
// 采用双重for循环的方式遍历数组
for(int i=0;i<arr.length;i++) {
int[] arr1 = arr[i];
for(int j=0;j<arr1.length;j++) {
System.out.print(arr1[j]);
}
System.out.println(); // 换行
}
// 采用foreach语句遍历
// 定义一个外层循环计数变量
int a = 0;
for (int[] arr2 : arr) {
a++;
// 定义一个内层循环计数变量
int b=0;
for (int ar : arr2) {
b++;
//判断是否是数组中最后一个元素
if(a == arr.length && b == arr2.length) {
System.out.println(ar);
}else {
System.out.println(ar+",");
}
}
}
- 填充替换数组元素
数组元素定义后,可通过Arrays中方法fill(),对数组元素进行替换。
fill(int[] a,int value) 将指定的int值value分配给int型数组每个元素。
fill(int[] a, int fromIndex, int toIndex, int value) 该方法将指定的int值value分配给int型数组指定范围中的每个元素,填充的范围从索引fromIndex(包括该索引)一直到 toIndex(不包括该索引),如果 fromIndex == toIndex ,则填充范围为空。
注意:如果指定的索引大于或等于要填充的数组长度,则会报数组越界异常。
例如:// 首先定义一个数组
int arr[] = new int[5] ;
//1. 使用fill(int[] a,int value) 方法
Arrays.fill(arr, 8);
// 遍历数组
for (int i : arr) {
System.out.println(i);
}
//2. 使用fill(int[] a, int fromIndex, int toIndex, int value) 方法
//重新定义一个数组,并且初始化值
int[] arr2 = new int[] {23,45,64,25};
Arrays.fill(arr2, 0, 2, 44);
// 遍历数组
for (int i : arr2) {
System.out.println(i);
}
- 对数组进行排序
通过Arrays中的sort()方法,可以对数组的元素进行排序,另外当数组的数据类型是String类型,他的排序算法是根据字典编排顺序排序的,因此数字应当在字母前面,大写字母要在小写字母前面。
例如://定义一个数组,并且初始化值
int[] arr3 = new int[] {23,45,64,25};
Arrays.sort(arr3);
// 遍历数组
for (int i : arr3) {
System.out.println(i);
}
- 复制数组
Arrays类中的copyOf()和copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制数组至指定长度;copyOfRange()方法是将指定数组的指定长度复制到一个新的数组。
copyOf()
语法: copyOf(arr,int newIndex);
arr 表示要进行复制的数组;
newIndex 表示复制后新数组的长度,如果新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整数型数组用0填充,char型数组用null填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取到满足新数组长度为止。
copyOfRange()
语法:copyOfRange(arr,int fromIndex, int toIndex);
arr 表示要复制的数组;
fromIndex 表示指定开始复制数组的索引位置,fromIndex必须在0至整个数组长度之间,新数组包括索引是fromIndex的元素。
toIndex 表示指定复制数组范围的最后位置,可大于数组长度,新数组不包括索引toindex的元素。
例如:// 首先定义一个数组
int arr [] = new int[] {2,5,4,6,27,9,12};
// 使用copyOf方法
int[] newArr = Arrays.copyOf(arr, 3);
System.out.println("复制后的新数组newArr中的元素是:");
for (int i : newArr) {
System.out.print(i+",");
}
System.out.println();
// 使用copyOfRange()方法
int[] newArr1 = Arrays.copyOfRange(arr, 2, 4);
System.out.println("复制后的新数组newArr1中的元素是:");
for (int i : newArr1) {
System.out.print(i+",");
}
- 数组查询
Arrays类中的binarySearch()方法,可以使用二分搜索法来搜索指定数组,以获取指定对象,该方法返回的是要搜索元素的索引值。
binarySearch(Object[] a, Object key)
如果key值包含在数组a中,则返回搜索值的索引,否则返回-1或者“-”插入点。插入点是搜索键要插入数组的那一点,即第一个大于此键的元素索引。
如果数组中所有的元素都小于指定的键,则为数组.length.
注意:必须在进行此调用方法之前,对数组进行排序,如果没有对数组进行排序,则结果是不确定,如果数组中包含多个带有指定值的元素,则无法保证找到的是哪一个。
binarySearch(Object[] a,int fromIndex,int toIndex,Object key)该方法在指定范围内搜索指定元素。如果要搜索的key,在指定的范围内,则返回该值的索引值,否则返回-1或“-”插入点。如果范围中所有的元素都小于指定的键,则为toIndex。如果指定的范围大于或等于数组长度,则会报越界异常。
例如:// 首先定义一个数组
int arr [] = new int[] {2,5,4,6,27,9,12};
//对数组使用sort方法排序
Arrays.sort(arr);
// binarySearch(Object[] a, Object key)
int index = Arrays.binarySearch(arr, 8);
System.out.println(index);
int index1 = Arrays.binarySearch(arr, 5);
System.out.println(index1);
// binarySearch(Object[] a,int fromIndex,int toIndex,Object key)
int index2 = Arrays.binarySearch(arr, 0, 3, 43);
System.out.println(index2);
int index3 = Arrays.binarySearch(arr, 0, 3, 4);
System.out.println(index3);