每个递归函数调用都会在线程堆栈上占用空间。 在Java中,Arrays.sort(Object [] a)使用合并排序。使用递归调用函数合并排序。为什么我们不为大型数组列表获取StackOverflowError?
我搜索过,在这种情况下我应该使用递归或堆栈,但我没有找到明确的答案?
答案 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不容易出现堆栈溢出。