为何调用排序方法后原数组arr也变为有序?Java技术咨询
原数组被意外排序的根本原因分析
核心原因:引用类型的传递机制
你碰到的问题本质是数组(或者列表、切片这类集合类型)属于引用类型,而非值类型。当你把原数组arr传给SortIt方法时,方法拿到的是指向原数组内存地址的引用,不是原数组的完整拷贝。这意味着SortIt里的排序操作,是直接在原数组占用的内存空间上修改的——不管方法有没有返回排序后的数组,原数组的内容已经被改动了。为什么赋值给
sortedArray也没用?
举个常见的代码逻辑例子(以Python为例):arr = [3, 1, 2] sortedArray = Sorting.SortIt(arr)如果
SortIt是直接对传入的arr做原地排序,再返回同一个引用,那sortedArray和arr指向的是同一块内存里的数组,自然两者都是有序的。哪怕方法有返回值,只要它修改了传入引用指向的对象,原数组肯定会变。临时复制有效的原因
你提前复制原数组再传入排序方法,等于创建了一块新内存存原数组的副本,排序方法改的是这个副本的内存,原数组的内存完全没被触碰,所以能保持原本的未排序状态。除了提前复制的其他解决思路
- 修改
SortIt方法,让它内部先创建原数组的副本,再对副本排序,最后返回这个副本,彻底不修改传入的原数组。 - 如果所用语言有内置的非原地排序方法(比如Python的
sorted()、C#的OrderBy()),直接用这类方法,它们会返回新的排序后的数组,不会改动原数组。
- 修改
内容的提问来源于stack exchange,提问作者hipposaver
相关产品推荐
相关产品推荐

