Java ArrayDesk如何比stack更快?
据javadoc说, ArrayQue类用作堆栈时可能比堆栈快 我不明白ArrayDeque怎么能比stack快。假设堆栈使用linkedlist实现,如下所示:Java ArrayDesk如何比stack更快?,java,stack,arraydeque,Java,Stack,Arraydeque,据javadoc说, ArrayQue类用作堆栈时可能比堆栈快 我不明白ArrayDeque怎么能比stack快。假设堆栈使用linkedlist实现,如下所示: Push: Insert new element at the head, teamp->next = head; head = temp (where temp is the element to be inserted) Pop: Remove the element from head, and make head =
Push: Insert new element at the head, teamp->next = head; head = temp
(where temp is the element to be inserted)
Pop: Remove the element from head, and make head = head->next
对于大量的元素,ArrayDeque需要调整大小,这在使用LinkedList实现的堆栈中不会出现。那么ArrayQue比stack快多少呢?因为大多数操作不需要调整数组的大小,特别是当队列达到稳定大小且不再增长时 每次添加项目时,
堆栈
都必须分配新对象,更新链接等
ArrayDeque
只需在数组中放入一个对象并更新索引。关键字为“可能”。如果确实进行了调整大小,则调整速度可能会慢一些,但堆栈不太可能增长那么多。根据我的经验,链表仅在一种情况下比数组列表更有效-在这种情况下,您经常希望在一次通过列表的过程中从列表中的随机点添加或删除多个元素。在其他情况下,数组列表通常更好——更快的查找、随机访问、更少的内存。如果ArrayQue基于数组,则可能不需要为其中存储的每个项分配额外的节点对象
由于堆栈通常会在列表的末尾添加/删除项目,因此基于数组的解决方案可能更有效ArrayDeque是Java集合框架的一部分,并且编写时不具有固有的线程安全性
Stack、Vector和Hashtable是Java1.0附带的,它们是通过线程安全操作实现的(因为当时它似乎是个好主意)。获取和释放线程锁在时间上相对昂贵,因此这些数据结构将比JCF中的同类数据结构慢得多。只要您执行的主要操作不是“包含”搜索或“大容量插入”等,数组将比其他数据结构工作得更快。“更快”部分始终取决于使用情况。平均而言,即如果采用平均时间,ArrayQue将比堆栈快。使用ArrayQue而不是堆栈有多种原因,因为ArrayQue是一个作为数组实现的双端队列。因此,它可以相对较快地增长。如果您不打算使用syncronizedstack,那么ArrayDeque可能比stack更好,后者是线程安全的(因此速度较慢)。ArrayDeque也有更好的引用位置。事实上,我认为列表标准中的随机点仍然不够具体。除非您已经在列表上进行了迭代,否则
ArrayList
可能仍然会更快,因为在修改后的列表上对元素进行无序排列并不比仅在LinkedList
中查找元素所需的列表扫描慢多少。基本上,在搜索列表时修改列表或在列表顶部执行大量操作是LinkedList
的优势所在。@Tim B-我更新了答案以反映这一点-你是对的。这正确吗?考虑到Java堆栈实际上不是使用任何链接结构实现的,而是由OP假设的。