为什么在大型数组上使用Arrays.sort(Object [] a)时我不会得到StackOverflowError?

时间:2015-07-08 15:00:01

标签: java arrays mergesort

每个递归函数调用都会在线程堆栈上占用空间。 在Java中,Arrays.sort(Object [] a)使用合并排序。使用递归调用函数合并排序。为什么我们不为大型数组列表获取StackOverflowError?

我搜索过,在这种情况下我应该使用递归或堆栈,但我没有找到明确的答案?

2 个答案:

答案 0 :(得分:0)

Arrays.sort并没有使用合并排序的经典教科书版本,而是基于TimSort as you can read here的更复杂的版本。

此外,在Java中,堆栈大小不是固定限制,但您可以将其设置为JVM的选项。

如果您尝试,可以非常轻松地生成OutOfMemory异常或堆栈限制错误,但(幸运的是)库函数旨在尝试避免它。

答案 1 :(得分:0)

典型的Java堆栈大小至少为64k。由于合并排序的想法是在每一步将数组拆分为2,所以至少需要让3000个拆分才能获得堆栈溢出。假设您有一个大小为32位(即大约40亿)元素的Object数组,它仍然比64k小很多。所以Arrays.sort不容易出现堆栈溢出。