Java StackOverflowerr什么时候被抛出?
作业中出现了一些问题,可能是因为我的马铃薯笔记本电脑,但我感兴趣的是,不平衡的BST(故意)何时会发生堆栈溢出 因此,我比较了搜索AVL树和不平衡BST的最差性能,搜索元素的方法同样适用于AVL,但我得到了BST的StackOverflow错误。BST最终只是一个链表,其中包含“坏数据”(按字母顺序排列的名称;大约10000个),那么对entryExists的调用次数是多少呢 我知道在最坏的情况下,非平衡BST的性能明显比AVL差得多,但我想限制搜索查询以获取某种时间编号Java StackOverflowerr什么时候被抛出?,java,binary-search-tree,avl-tree,Java,Binary Search Tree,Avl Tree,作业中出现了一些问题,可能是因为我的马铃薯笔记本电脑,但我感兴趣的是,不平衡的BST(故意)何时会发生堆栈溢出 因此,我比较了搜索AVL树和不平衡BST的最差性能,搜索元素的方法同样适用于AVL,但我得到了BST的StackOverflow错误。BST最终只是一个链表,其中包含“坏数据”(按字母顺序排列的名称;大约10000个),那么对entryExists的调用次数是多少呢 我知道在最坏的情况下,非平衡BST的性能明显比AVL差得多,但我想限制搜索查询以获取某种时间编号 [我不认为发布实际代码
[我不认为发布实际代码是必要的,但如果有人需要,我会上传它-据我所知,不仅仅是我在执行无限递归(两种方法都使用相同的方法)。]如果单个线程上有太多的方法调用处于活动状态(即正在进行中),则会发生堆栈溢出 每个方法调用都需要一个堆栈框架来保存调用的局部变量和一些内部调用信息。(通常是返回地址和保存的堆栈顶部指针。)线程的堆栈帧保存在线程的堆栈上。它具有固定的大小(在创建线程时确定)。默认值取决于JVM和命令行开关,但通常为1M字节 有四种情况可能导致堆栈溢出:
在您的情况下,场景2是您的担忧。这不应该发生,如果你的树是适当的平衡。然而,如果一棵树非常不平衡,它可能非常深。将其与递归(比如)搜索树的算法相结合,足够深的树可能导致堆栈溢出
注意:这不是无限递归。相反,递归算法和数据结构的组合有一个不幸的“形状”。如果单个线程上有太多的方法调用处于活动状态(即正在进行中),则会发生堆栈溢出 每个方法调用都需要一个堆栈框架来保存调用的局部变量和一些内部调用信息。(通常是返回地址和保存的堆栈顶部指针。)线程的堆栈帧保存在线程的堆栈上。它具有固定的大小(在创建线程时确定)。默认值取决于JVM和命令行开关,但通常为1M字节 有四种情况可能导致堆栈溢出:
在您的情况下,场景2是您的担忧。这不应该发生,如果你的树是适当的平衡。然而,如果一棵树非常不平衡,它可能非常深。将其与递归(比如)搜索树的算法相结合,足够深的树可能导致堆栈溢出
注意:这不是无限递归。相反,它是递归算法和数据结构的组合,具有一个不幸的“形状”。当代码不断调用自身时,它会被抛出,就像当一个方法再次调用自身时一样。最有可能的是,您在代码执行的某个递归中弄乱了返回条件。在这个网站上,stackoverflow异常显示为downvotes,因为人们认为您之前没有做过任何研究,例如,在搜索引擎中输入异常名称,它的右边是@StephenC,我的错!但不幸的是,我现在无法编辑它。因此,我删除并再次发布评论。感谢您纠正我的错误。StackOverflowerError是一种情况,因为在您的程序中发生了无限多的方法调用。所谓无限,我指的是超过方法调用堆栈允许的大小。这种情况主要发生在以递归方式实现算法时,并且初始条件没有正确实现以停止自调用。如果正确实现了算法,可以增加堆栈大小以支持所需的递归调用数。在这里,您可以了解它是如何被抛出的:当您的代码不断调用自己时,就像当一个方法再次调用自己时一样。最有可能的是,您在代码执行的某个递归中弄乱了返回条件。在这个网站上,stackoverflow异常显示为downvotes,因为人们认为您之前没有做过任何研究,例如,在搜索引擎中输入异常名称,它的右边是@StephenC,我的错!但不幸的是,我现在无法编辑它。所以我删除了