首页 > java.util.Arrays.sort()数组形参传递为啥能修改原始数组的内容?

java.util.Arrays.sort()数组形参传递为啥能修改原始数组的内容?

如题java.util.Arrays.sort(int[] a)数组形参传递为啥能修改原始数组的内容?

[public static void sort(int[] a)](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(int[]))

Sorts the specified array into ascending numerical order.

Implementation note: The sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.

Parameters:a - the array to be sorted


回答你的问题,你去看源码,它用了DualPivotQuicksort.sort()的一个方法,你点进去这个方法:

static void sort(int[] a, int left, int right, int[] work, int workBase, int workLen)

其中这个int[]work临时数组,就是在排序过程中提供数据存放的,排序完,肯定会更改原数组int[]a 的内容。
此外,关于Arrays.sort()的方法,有如下说明:

1.Java Arrays中提供了对所有类型的排序。其中主要分为8种基本数据类型和Object两大类。
2.Java对Primitive(int,float等原型数据)数组采用快速排序,对Object对象数组采用归并排序。对于对象的排序,稳定性很重要。比如成绩单,一开始可能是按人员的学号顺序排好了的,现在让我们用成绩排,那么你应该保证,本来张三在李四前面,即使他们成绩相同,张三不能跑到李四的后面去。而快速排序是不稳定的。对象数组中保存的只是对象的引用,这样多次移位并不会造成额外的开销,但是,对象数组对比较次数一般比较敏感,有可能对象的比较比单纯数的比较开销大很多。归并排序在这方面比快速排序做得更好,这也是选择它作为对象排序的一个重要原因之一。
3.排序优化:实现中快排和归并都采用递归方式,而在递归的底层,也就是待排序的数组长度小于7时,直接使用冒泡排序,而不再递归下去。分析:长度为6的数组冒泡排序总比较次数最多也就1+2+3+4+5+6=21次,最好情况下只有6次比较。而快排或归并涉及到递归调用等的开销,其时间效率在n较小时劣势就凸显了,因此这里采用了冒泡排序,这也是对快速排序极重要的优化。
4.源码中的快速排序,主要做了以下几个方面的优化,当待排序的数组中的元素个数较少时,源码中的阀值为7,采用的是插入排序。尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序的递归操作影响性能。较好的选择了划分元(基准元素)。能够将数组分成大致两个相等的部分,避免出现最坏的情况。例如当数组有序的的情况下,选择第一个元素作为划分元,将使得算法的时间复杂度达到O(n^2)。


修改的是引用的值,就是int[] a ,那个a指向的值,


1、对于int[] a,变量a是一个对象引用,可以理解为保存数组对象在堆中的地址(数组中的具体元素都保存在堆中);
2、sort()中传入变量a的引用值,即1中说的数组在堆内的地址值,利用a的值,当然可以访问到在堆内的数组,进而程序可以修改数组内元素的值和顺序了。


因为传入了原来数组地址的一个副本,进而能改变原来数组的值.


Java里面对象除了String,别的都是传递的引用。

【热门文章】
【热门文章】