Java基础——数组

数组的创建及使用

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。如有疑问请看源码。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值