数组的创建及使用
Java中数组分为一维数组、二维数组、三维数组、多维数组,最常用的是一维、二维数组,其他感觉用的很少,这篇博客主要讲解下数组的创建使用等功能
一:一维数组
1:创建及访问
先声明再进行内存分配,声明的方式为:
数组元素类型 数组名字[] /数组元素类型[] 数组名字
数组声明完成后还不能立即访问它的任何元素,因为声明数组只是给出了数组的名字及元素的数据类型,要想真正使用数组需要
为它分配内存空间以及指定数组长度。
分配内存空间及指定数组长度:
数组名字 = new 数组元素类型[数组元素的个数];
分配内存空间后可立即为数组进行赋值并使用,例:
int arr[] = new int[4];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr数组为int的数据类型,共包含3个元素,除此种方式外,数组的创建还分如下2种方式:
int arr[] = new int[]{1,2,3,4};
或
int arr[] = {1,2,3,4};
不需要指定数组长度,直接进行赋值即可,访问元素方式一致,使用for循环进行输出每个元素
for(inti=0;i<arr.length;i++){
Log.e("数组","第"+(i+1)+"个数="+ arr[i]);
}
输出结果:
01-29 13:48:39.592 6003-6003/com.sotp.application E/数组: 第1个数=1
01-29 13:48:39.592 6003-6003/com.sotp.application E/数组: 第2个数=2
01-29 13:48:39.592 6003-6003/com.sotp.application E/数组: 第3个数=3
01-29 13:48:39.592 6003-6003/com.sotp.application E/数组: 第4个数=4
二:二维数组
1:创建及访问
声明方式与一维数组相同:
数组元素类型 数组名字[][];/数组元素类型[][] 数组名字;
分配内存空间方式:
直接为每一维分配内存空间,第一个维度表示行,第二个表示列,这种情况下每行的列数是相等的,不足位默认为0
int arr[][] = new int [2] [3];
arr[0][0] =1;
arr[0][1] =2;
arr[1][0] =3;
arr[1][1] =4;
arr[1][2] =5;
for(inti=0;i<arr.length;i++){
for(intj=0;j<arr[i].length;j++){
Log.e("数组","元素"+ arr[i][j]);
}
}
输出结果:
01-29 17:53:02.705 5177-5177/com.sotp.application E/数组: 元素1
01-29 17:53:02.705 5177-5177/com.sotp.application E/数组: 元素2
01-29 17:53:02.705 5177-5177/com.sotp.application E/数组: 元素0
01-29 17:53:02.705 5177-5177/com.sotp.application E/数组: 元素3
01-29 17:53:02.705 5177-5177/com.sotp.application E/数组: 元素4
01-29 17:53:02.710 5177-5177/com.sotp.application E/数组: 元素5
分别为每一维分配内存空间,不规则的二维数组
int arr[][] = new int[2][];
arr[0] = new int[2];
arr[1] = new int[3];
如上图所示,arr[0]的一维数组长度等于2,arr[1]的一维数组长度等于3,赋值并进行访问方法为:
arr[0][0] =1;
arr[0][1] =2;
arr[1][0] =3;
arr[1][1] =4;
arr[1][2] =5;
for(inti=0;i<arr.length;i++){
for(intj=0;j<arr[i].length;j++){
Log.e("数组","元素"+ arr[i][j]);
}
}
输出结果:
01-29 17:47:15.600 30071-30071/com.sotp.application E/数组: 元素1
01-29 17:47:15.600 30071-30071/com.sotp.application E/数组: 元素2
01-29 17:47:15.600 30071-30071/com.sotp.application E/数组: 元素3
01-29 17:47:15.600 30071-30071/com.sotp.application E/数组: 元素4
01-29 17:47:15.600 30071-30071/com.sotp.application E/数组: 元素5
数组的基本操作类——Arrays
Java中Arrays类包含了操作数组的各种方法,该类位与java.util包下,下面会对此类中的方法进行介绍。
1:替换数组元素-fill()
该方法为静态方法,通过各种重载形式可完成任意类型的数组元素的替换,这里根据int型数组为例进行说明fill()方法的使用:
int[] arrs = new int[5];
Arrays.fill(arrs,9);
for(int j=0;j<arrs.length;j++){
Log.e("数组","元素"+ arrs[j]);
}
输出结果:
01-30 10:19:12.079 16165-16165/com.sotp.application E/数组: 元素9
01-30 10:19:12.079 16165-16165/com.sotp.application E/数组: 元素9
01-30 10:19:12.079 16165-16165/com.sotp.application E/数组: 元素9
01-30 10:19:12.079 16165-16165/com.sotp.application E/数组: 元素9
01-30 10:19:12.079 16165-16165/com.sotp.application E/数组: 元素9
fill(int [] a,int value); 将指定的int值分配给int型数组的每个元素
另一种方法并非全部赋值,而是根据指定的范围进行赋值,如:
int[] arrs = new int[5];
Arrays.fill(arrs,1,3,10);
for(int j=0;j<arrs.length;j++){
Log.e("数组","元素"+ arrs[j]);
}
输出结果:
01-30 10:24:27.719 21036-21036/com.sotp.application E/数组: 元素0
01-30 10:24:27.719 21036-21036/com.sotp.application E/数组: 元素10
01-30 10:24:27.719 21036-21036/com.sotp.application E/数组: 元素10
01-30 10:24:27.719 21036-21036/com.sotp.application E/数组: 元素0
01-30 10:24:27.719 21036-21036/com.sotp.application E/数组: 元素0
fill(int[] a,int fromIndex,int toIndex,int value)将指定的int值分配给数组指定范围中的每个元素,fromIndex为指定的第一个需
填充的元素;toIndex为指定填充的最后一个元素索引(但不包括在内);value为所需要填充的值。
注:这里如果fromIndex==toIndex的话,则填充的范围为空,数组元素值不会发生任何变化;指定的索引位置大于或等于要进
行填充的数组长度,则会报ArrayIndexOutOf的异常
2:对数组进行排序-sort()
sort()方法可对任意类型的数组进行升序排序,具体实现如下:
int[] arrs = new int[]{3,56,24,67};
Arrays.sort(arrs);
for(int j=0;j<arrs.length;j++){
Log.e("数组","元素"+ arrs[j]);
}
输出结果:
01-30 10:36:32.234 31901-31901/com.sotp.application E/数组: 元素3
01-30 10:36:32.234 31901-31901/com.sotp.application E/数组: 元素24
01-30 10:36:32.234 31901-31901/com.sotp.application E/数组: 元素56
01-30 10:36:32.234 31901-31901/com.sotp.application E/数组: 元素67
升序排序很简单,只需要将需要排序的数组做为参数传入方法中即可,以上为对数组中所有元素进行排序,那sort的方法也可以
有选择的对数组中某个范围内的元素进行排序,而不是全部,具体实现如下:
int[] arrs = new int[]{3,56,24,44,67};
Arrays.sort(arrs,1,3);
for(int j=0;j<arrs.length;j++){
Log.e("数组","元素"+ arrs[j]);
}
得到结果:
01-30 10:41:39.644 5257-5257/com.sotp.application E/数组: 元素3
01-30 10:41:39.644 5257-5257/com.sotp.application E/数组: 元素24
01-30 10:41:39.644 5257-5257/com.sotp.application E/数组: 元素56
01-30 10:41:39.644 5257-5257/com.sotp.application E/数组: 元素44
01-30 10:41:39.644 5257-5257/com.sotp.application E/数组: 元素67
sort(int[] arr,int formIndex,int toIndex)方法中,formIndex为需要排序的第一个元素索引,toIndex为最后一个需要排序的元
素索引(但不包括在内),这样就实现了对数组中某一范围元素进行排序的效果,其他类型的数组使用方法与此一致。
2-1 :这里贴出自己写的降序的方法:
private void descAry(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j] > a[i]) {
int t = a[j];
a[j] = a[i];
a[i] = t; } }
}}
使用方法及结果输出:
int[] arrs = new int[]{3, 56, 24, 44, 67};
descAry(arrs);
Log.e("降序","输出结果:"+Arrays.toString(arrs));
01-30 10:51:57.449 14475-14475/com.sotp.application E/降序: 输出结果:[67, 56, 44, 24, 3]
将数组中元素进行前后对比,将最高值放到前面,依次类推即可
3:复制数组
复制数组的方法有copyOf()与copyOfRange(),第一个方法是复制当前数组到指定长度的新数组,超出当前数组的元素默认为
0;第二个方法是将当前数组中某一范围的元素复制到新数组。
copyOf(int[] arr)方法使用:
int arr[] = new int[]{23,42,12};
int newAry [] = Arrays.copyOf(arr,5);
for(int i=0;i<newAry.length;i++){
Log.e("新数组","输出结果:"+newAry[i]);
}
输出结果:
01-30 11:09:14.309 30384-30384/com.sotp.application E/新数组: 输出结果:23
01-30 11:09:14.309 30384-30384/com.sotp.application E/新数组: 输出结果:42
01-30 11:09:14.309 30384-30384/com.sotp.application E/新数组: 输出结果:12
01-30 11:09:14.309 30384-30384/com.sotp.application E/新数组: 输出结果:0
01-30 11:09:14.309 30384-30384/com.sotp.application E/新数组: 输出结果:0
copyOfRange(int[] arr,int formIndex,int toIndex)方法使用:
int arr[] = new int[]{23,42,12};
int newAry [] = Arrays.copyOfRange(arr,1,3);
for(int i=0;i<newAry.length;i++){
Log.e("新数组","输出结果:"+newAry[i]);
}
输出结果:
01-30 11:11:24.184 32467-32467/com.sotp.application E/新数组: 输出结果:42
01-30 11:11:24.184 32467-32467/com.sotp.application E/新数组: 输出结果:12
formIndex为开始复制数组索引的位置,取值必须在0至整个数组的长度之间;toIndex为要复制范围的最后索引位置,值可以大
于当前数组长度,新数组中不包括当前索引,新数组长度大于复制的元素个数时空余值默认为0,如下:
int arr[] = new int[]{23,42,12};
int newAry [] = Arrays.copyOfRange(arr,1,5);
for(int i=0;i<newAry.length;i++){
Log.e("新数组","输出结果:"+newAry[i]);
}
01-30 11:12:38.459 1246-1246/com.sotp.application E/新数组: 输出结果:42
01-30 11:12:38.459 1246-1246/com.sotp.application E/新数组: 输出结果:12
01-30 11:12:38.459 1246-1246/com.sotp.application E/新数组: 输出结果:0
01-30 11:12:38.459 1246-1246/com.sotp.application E/新数组: 输出结果:0
4:数组查询
在查询之前必须调用sort()方法进行排序,如不排序则结果是不确定的,如果数组包含多个带有指定值的元素,则将得到最后一个值的索引值,例如:
int arrs[] = new int[]{23,42,12,12,12};
Arrays.sort(arrs); 排序后={12,12,12,23,42}
int tag = Arrays.binarySearch(arrs, 12);
Log.e("查找", "输出结果:" + tag);
输出结果:
01-30 13:40:46.383 18842-18842/com.sotp.application E/查找: 输出结果:2
如查询的值并不存在与数组中,则会返回-1或(-插入点),这里就引发了什么是插入点呢??根据我的实验及查看源码发现,插
入点是根据所传入的开始及结束索引值而定的,插入点指如果当前值在数组中并不存在,则经过排序后该值会出现在数组的第几
个数(在根据索引值指定的范围内)。
为了加深理解特贴出代码:
int arrs[] = new int[]{23,42,11,10,12};
Arrays.sort(arrs); 排序后={10,11,12,23,42}
int tag = Arrays.binarySearch(arrs, 0,3,22);
Log.e("查找", "输出结果:" + tag);
输出结果:
01-30 14:56:05.233 26499-26499/com.sotp.application E/查找: 输出结果:-4
根据输出结果,也就是当前int值22在0-3的索引值范围内不存在,而根据排序结果22应该在23的前面,因此如果22插入到数组中
的话将在23的位置,而这里的插入点是从1开始计算,所以22值是第4个,而返回的结果是(-插入点)的类型所以得到的值为
-4。如有疑问请看源码。。