Java堆排序疑问:fnSortHeap未返回数组但主方法仍能输出结果
关于堆排序方法无需返回数组却能修改原数组的解惑
嘿,这位Java新手朋友!我来帮你弄明白这个困惑~
你提到的这个问题,核心原因其实是Java中数组属于引用数据类型,和你之前接触的基本数据类型(比如int、char)的参数传递规则完全不同。
关键知识点:引用类型的参数传递
当你把一个数组作为参数传递给方法时,Java传递的并不是整个数组的拷贝,而是数组对象在内存中的引用(也就是内存地址)。也就是说:
- 主方法里的
arr变量,指向堆内存中存储{1, 3, 4, 5, 2}的数组对象 - 调用
fnSortHeap(arr, i - 1)时,方法的参数arr会拿到同一个引用,指向同一个数组对象
所以在fnSortHeap方法内部对数组元素进行的排序操作,都是直接修改这个共享的数组对象。当方法执行完毕回到主方法时,主方法里的arr依然指向这个已经被修改过的数组,自然能输出排序后的结果。
和你之前认知的区别
你之前以为需要方法返回数组再赋值,那是针对创建新数组并返回的场景。比如如果fnSortHeap内部是新建了一个数组来排序,而不是修改传入的数组,那确实需要用arr2 = fnSortHeap(arr, i - 1)这样的方式接收返回值。但现在这个堆排序的实现,是直接在传入的数组上进行原地排序,所以不需要返回数组。
举个简单的对比:
- 基本数据类型传递:
void change(int num) { num = 10; },调用后原变量不会变,因为传递的是值拷贝 - 数组传递:
void sort(int[] arr) { arr[0] = 99; },调用后原数组的第一个元素会变成99,因为传递的是引用
结合你的代码片段理解
你的主方法里定义了int arr[] = {1, 3, 4, 5, 2},调用fnSortHeap后,这个数组的元素已经被方法内部的排序逻辑修改了,所以后续直接输出arr就能看到排序后的结果,完全不需要再接收返回值。
内容的提问来源于stack exchange,提问作者Nguyễn Hoàng Minh
相关产品推荐
相关产品推荐

