数组进阶

System.arraycopy 数组拷贝

System类中提供arraycopy方法来进行数组拷贝。

源码:

  • src:目标数组

  • srcPos:从目标数组的某下标位置开始拷贝

  • dest:新数组

  • destPos:从新数组的某下标位置开始存放。

  • Length:(从目标数组的某下标位置开始拷贝)指定将目标数组的多少个元素赋给新数组的元素。

代码:

效果:

示例:

效果:

删除,本质是拷贝。

代码:

效果:

扩容,本质是拷贝。

代码:

效果:

完整代码:

这里再增加一个插入

效果:

Arrays工具类

主要方法是打印toString(),填充fill(),排序sort(),二分查找binarySearch()。

代码:

效果:

引用类型排序需实现Comparable接口。

实例:

效果:

二维数组

多维数组中,一般最多用到二维数组。工作中很少用到数组,都是用容器,所以这一节了解即可。

二维数组的内存空间

比如我们定义一个二维数组:int[][] a = new int[3]2。创建一个总的对象,有三个值a[0][…]、a[1][…]、a[2][…],然后这三个变量的值分别引用一维数组对象的地址值。

实例:

效果:

数组高级操作

冒泡排序

两两比较大小,大的往后,小的放前,交换位置。第一次循环比较完毕,最大的出现在最后面;第二次循环比较完毕,第二大的出现在最后面;依次类推,到最后一次比较完毕,从小到大依次排序。假如一个数组有N个元素,冒泡排序最多要比较1+2+3+……+n-1次,也就是(n-2)(n-1)/2次(请看初中数学)判断交换才把一组数字完全无误的比较从大到小出来。

代码:

结果:

看结果是不是有13个数字第一次循环比较了12次,第二次循环比较了11次,……第12次就比较了一次,总共比较了156次。

之前我们说过是一个拥有N个元素的数组最多需要(n-1)n次可以循环处理结果。然后注意再看结果

在第9次循环的最后一次比较排序结果就已经完全出来了。

所以我们要做优化

效果:

完整代码:

选择排序

概述:第一次排序会把后面的每一个元素和第一个元素比较,如果比第一个元素小,就把交换位置,第一次比较完毕,最小的值出现在第一位。接下来又是第二个元素和后面的元素一一比较…比较完毕,第二小的值出现在第二位。以此类推,到最后一位比较完毕,得到一个升序数组。数组长度是几就比较几次。

如:数组 int[] arr={5,2,8,4,9,1};下面是五次比较结果

示例:

二分查找

前提:排序好

概括:把一个数字从升序排序好的一组数字之间最中间那个数进行比较,如果等于,之间返回此数字下标;如果大于,就从这个中间数字的后一位和最后一位的中间位置再进行比较;

如果小于,就从这个中间数字的前一位和最前一位的中间位置再进行比较。如此反复,直到找完为止,找到返回,没有找到符合的值,报错。

实例:

杨辉三角

效果:

代码:

Last updated

Was this helpful?