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,让旧数组被垃圾回收(以及旧数组中的引用)。话虽如此,您提到的链表实现的内存效率要高得多。