Java stack.clear()更快还是弹出每个元素更快?
类似地,要查找堆栈中的元素数,Java stack.clear()更快还是弹出每个元素更快?,java,performance,data-structures,stack,Java,Performance,Data Structures,Stack,类似地,要查找堆栈中的元素数,stack.size()调用是否比弹出每个元素并计数快?当然我不再需要堆栈了。答案取决于堆栈类的实现,但是逻辑上弹出n的次数不能比获得计数并调用清除更快:这是一个O(n)算法 另一方面,获取count可能会更快,因为如果Stack存储了它所拥有的项数,那么它可以在一次访问中完成,从而成为一个O(1)*算法。类似地,一次性清除整个内容可以实现为O(1) *O(1)是一种奇特的说法,“不取决于堆栈上元素的数量”。堆栈继承自向量,而向量是定义大小()方法的类,而不是堆栈V
stack.size()
调用是否比弹出每个元素并计数快?当然我不再需要堆栈了。答案取决于堆栈
类的实现,但是逻辑上弹出n
的次数不能比获得计数
并调用清除
更快:这是一个O(n)算法
另一方面,获取count
可能会更快,因为如果Stack
存储了它所拥有的项数,那么它可以在一次访问中完成,从而成为一个O(1)*算法。类似地,一次性清除整个内容可以实现为O(1)
*O(1)是一种奇特的说法,“不取决于堆栈上元素的数量”。
堆栈继承自向量,而向量是定义大小()
方法的类,而不是堆栈Vector
还有一个名为elementCount
的受保护字段,它是Vector
中有效元素的数量。我假设size()
方法只返回这个变量,使得调用size()
比弹出和计数要快得多。此外,Vector不需要执行pops来计算元素,因为弹出不是Vector的一项功能。您可以编写两个函数,并用这些函数测试您的问题,您将学习并解决您的问题。编写一个函数,弹出每个元素,将其压入另一个堆栈,完成后将其全部压回原始数组(当调用.size()
时,要保持堆栈的完整性,则size调用不应修改堆栈)。另一个使用stack.size()
。然后调用主函数中的每个函数,并在两个函数调用之前和之后使用类似time()的函数。您将看到这两个函数在时间上的差异。试试看
当然,这取决于其他答案中提到的堆栈的实现。只需读取堆栈接口的文档,它就应该在那里。请考虑JVM中堆栈类的作者知道他们在做什么。如果出于某种原因,从堆栈中弹出所有元素的速度比clear()的其他实现快,那么他们将通过弹出所有元素来重新实现clear()。值得注意的是,如果堆栈内部使用链表类型结构,clear
可能只能是O(1)。如果它使用一个数组(例如,java.util.Stack
),那么您仍然需要对数组元素执行O(n)清零或新数组的O(n)分配。如果保持底层数组不变,只将计数器设置为0,则会出现内存泄漏(以前保存的对象仍会被堆栈引用,因此不符合GC的条件)。也就是说,这些O(n)操作的系数可能会有很大的不同。@yshavit另一个选项是堆栈
简单地创建一个具有相同容量的新数组,并将大小设置为0,让旧数组被垃圾回收(以及旧数组中的引用)。话虽如此,您提到的链表实现的内存效率要高得多。