java数组怎么使用_Java数组的简单应用

本文记录Java数组的几个基本应用。

数组的初始化和遍历

数组初始化和遍历都有三种方式,参考如下代码。

1 importjava.util.Arrays;2 public classArrayDemo{3 public static voidmain(String[] args){4 //定义数组的三种方式5 //方法1 动态初始化

6 int[] arr1=new int[3];7 arr1[0]=1;8 //方法2 静态初始化

9 int[] arr2=new int[]{1,2,3};10 //方法3 静态初始化省略写法

11 int [] arr3={1,2,3};12 //遍历数组的三种方式13 //方法1 普通for循环,通过下标获取,并且可以改变数组的值

14 System.out.println("-----------普通for循环-----------");15 for(int i=0;i

22 System.out.println("-----------增强型for循环-----------");23 for(intnumber:arr2){24 number*=2;25 }26 for(intnumber:arr2){27 System.out.println(number);28 }29 //方法3 使用Arrays.toString()方法返回

30 System.out.println("-----------使用Arrays.toString()方法返回-----------");31 String str=Arrays.toString(arr3);32 System.out.println(str);33 }34 }

运行结果,注意增强型for循环只能进行遍历,不能对数组内容进行修改,另外静态初始化省略的写法不能分两步写,这个需要注意下。

2c51ba63e0de0f84e894c8465886395c.png

求数组中最值

求数组中最值一般有两种思路,一种是比较数值直接得到最值,另外一种是比较后得到索引,本次使用后者。

1 public classArrayMax{2 public static voidmain(String[] args){3 //获取一个数组中的最大值,采用记录下标的方式

4 int[] arr=new int[]{12,34,1,7,5,44,98};5 int index=0;6 for(int i=1;iarr[index]){8 index=i;9 }10 }11 //输出最大值

12 System.out.println(arr[index]);13 }14 }

运行结果

d683a3ce569ec6552471e52f009db6f4.png

冒泡排序及时间&空间复杂度

数组的排序,Java提供了现成API可以处理,如Arrays.sort()方法(底层使用了快速排序+归并排序)可以对数组进行升序排列,此外还可以使用常用的排序方式,本文再次写冒泡和选择排序,具体的参考博文 https://www.cnblogs.com/youngchaolin/p/11097567.html。

(1)冒泡排序实现

1 importjava.util.Arrays;2 public classBubbleSort{3 public static voidmain(String[] args){4 //冒泡排序练习

5 /**

6 数组相邻元素两两比较,得到最大值或最小值7 比如给一个长度为6的数组,将有如下比较逻辑:8 第1次比较,比较5次9 第2次比较,比较4次10 ...11 第5次比较,比较1次12 得到比较轮序号+比较次数=数组长度13 比较轮次:1~数组长度-114 第i轮比较次数:数组长度-i15 比较轮次使用外层for循环来控制,比较次数用内层for循环16 */

17 int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456};18 //降序

19 for(int i=1;i

30 时间复杂度:O(n^2)31 比较次数即一个等差数列,去掉常数部分32 空间复杂度:o(1)33 由于创建了3个变量,因此表示为3*n^0,去掉常数3,空间复杂度为o(1)34 */

35 }36 }

排序过程及结果。

49e10d3225fac2054e347cb1a61824ff.png

(2)选择排序实现

1 importjava.util.Arrays;2 public classSelectSort{3 public static voidmain(String[] args){4 //选择排序练习

5 /**

6 比较数组当前位置元素和后面所有元素,如果后面存在比当前元素大或小的,交换数值,或者使用记录下标的方式7 最后交换下标的数组,这里暂时采用前种方式8 比如给一个长度为6的数组,将有如下比较逻辑:9 第1次比较,比较5次10 第2次比较,比较4次11 ...12 第5次比较,比较1次13 得到比较轮序号+比较次数=数组长度14 比较轮次:1~数组长度-115 第i轮比较次数:数组长度-i16 比较轮次使用外层for循环来控制,比较次数用内层for循环17 */

18 int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456};19 //降序

20 for(int i=0;i

24 arr[i]=arr[i]^arr[j];25 arr[j]=arr[i]^arr[j];//arr[j]=arr[i]^arr[j]^arr[j]=arr[i];

26 arr[i]=arr[i]^arr[j];//arr[i]=arr[i]^arr[j]^arr[i]=arr[j];

27 }28 }29 System.out.println("排序后的数组为"+Arrays.toString(arr));30 }31 /**

32 时间复杂度:O(n^2)33 比较次数即一个等差数列,去掉常数部分34 空间复杂度:o(1)35 由于创建了3个变量,因此表示为3*n^0,去掉常数3,空间复杂度为o(1)36 */

37 }38 }

排序过程及结果。

fd5ca67b41b5011652cbf2bbf625586d.png

数组的二分查找

当数组是有序的情况,可以使用二分查找来查找某个数是否存在,其时间复杂度为O(logn),相比来说可能比冒泡和选择排序性能更加好。

1 importjava.util.Scanner;2 importjava.util.Arrays;3 public classBinarySearch{4 public static voidmain(String[] args){5 //使用二分查找寻找一个数在数组中的位置

6 /**

7 如果数组是有序数组,先比较这个数和数组中中间位置((下标左边界+下标右边界)/2)数值的大小8 1 如果恰好找到了则返回数对应下标9 2 如果比中间值大,更新数组左边界10 3 如果比中间值小,更新数组右边界11 循环上面3个步骤,继续比较,循环的条件是 下标左边界不能大于下标右边界12 */

13 System.out.println("请输入要查找的数");14 Scanner scan=newScanner(System.in);15 int number=scan.nextInt();16

17 int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456,88};18 //变成有序数组

19 Arrays.sort(arr);20 //重新打印

21 System.out.println(Arrays.toString(arr));22 int minIndex=0;23 int maxIndex=arr.length-1;24 int mid=(minIndex+maxIndex)/2;25 while(minIndex<=maxIndex){26 System.out.println("比较");27 if(arr[mid]==number){28 System.out.println("数组的下标为:"+mid);29 break;30 }31 if(arr[mid]

33 }34 if(arr[mid]>number){35 maxIndex=mid-1;//mid对应的数都不相等,mid不需要比较了,继续往左边移动一位

36 }37 mid=(minIndex+maxIndex)/2;38 }39 /**

40 时间复杂度 O(logn)41 空间复杂度 o(1)42 */

43 }44 }

测试结果

6990b43397899b45b1e917dc233e2ac1.png

总结

以上为数组的基本知识,后续可供参考。


版权声明:本文为weixin_42394054原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。