`
周英能
  • 浏览: 187984 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

LinkedList,Deque,Queue,Stack,ArrayDeque

 
阅读更多

 

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 getremove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列双端队列

此类实现 Deque 接口,为 addpoll 提供先进先出队列操作,以及其他堆栈和双端队列操作。所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

 

注意,此实现不是同步的。

如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:

   List list = Collections.synchronizedList(new LinkedList(...));

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。

注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。

 

双端队列

 

第一个元素(头部) 最后一个元素(尾部)
抛出异常 特殊值 抛出异常 特殊值
插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)
移除 removeFirst() pollFirst() removeLast() pollLast()
检查 getFirst() peekFirst() getLast() peekLast()

 

堆栈

 

堆栈方法 等效 Deque 方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

 

从 Queue 接口继承的方法完全等效于 Deque 方法,

Queue 方法 等效 Deque 方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

Deque 一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。

//后进先出
public void stack(){
System.out.println("stack started");
Deque<Integer> stack = new LinkedList<Integer>();

for(int i=0;i<11;i++){
//如栈
stack.push(i);
}
//出栈
while(!stack.isEmpty()){
System.out.println(stack.pop());;
}
System.out.println("stack end");
}

//先进先出
public void queue(){
System.out.println("queue started");
Queue<Integer> queue = new LinkedList<Integer>();
for(int i=0;i<11;i++){
//入列
queue.offer(i);
}
while(!queue.isEmpty()){
//出队
System.out.println(queue.poll());;
}
System.out.println("queue end");
}

ArrayDeque

 

Deque 接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。大多数 ArrayDeque 操作以摊销的固定时间运行。异常包括removeremoveFirstOccurrenceremoveLastOccurrencecontainsiterator.remove() 以及批量操作,它们均以线性时间运行。此类的 iterator 方法返回的迭代器是快速失败 的:如果在创建迭代器后的任意时间通过除迭代器本身remove 方法之外的任何其他方式修改了双端队列,则迭代器通常将抛出 ConcurrentModificationException。因此,面对并发修改,迭代器很快就会完全失败,而不是冒着在将来不确定的时刻任意发生不确定行为的风险。

注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测 bug。

此类及其迭代器实现 Collection 和 Iterator 接口的所有可选 方法。

分享到:
评论

相关推荐

    扩展矩阵leetcode-Algorithms-camp:算法营

    ArrayDeque实现了Deque接口,LinkedList实现了Deque,List接口 (1)对比: ArrayDeque 为数组结构,插入元素不能为null,无法确定数据量时,后期扩容会影响效率 LinkedList 链表结构,插入元素不能为null,无法确定...

    Java_Stack_Queue:Java中使用链表的堆栈和队列实现

    `LinkedList`类实现了`Deque`接口,这个接口包含了堆栈和队列的操作,因此我们可以通过它来实现堆栈功能。例如,我们可以使用`push()`方法添加元素到堆栈顶部,`pop()`方法移除并返回顶部元素,以及`peek()`方法查看...

    java版数据结构 很好很强大

    5. **栈(Stack)**:Java的Deque接口和ArrayDeque类可以用来实现后进先出(LIFO)的栈操作。 6. **链表**:LinkedList类实现了List接口,通过节点链接实现,插入和删除操作高效。 7. **队列**:LinkedList也可以...

    部分Java数据结构使用

    Java中的LinkedList实现了Deque(双端队列)接口,可以作为Queue使用。Queue接口定义了enqueue(add())、dequeue(remove())等方法,而PriorityQueue则提供了一个根据元素自然排序或自定义比较器进行排序的队列。 ...

    JAvaOOp06 第六章 集合框架.pdf|06 第六章 集合框架.pdf

    4. `Queue`和`Deque`:`Queue`接口表示先进先出(FIFO)的数据结构,常用的实现有`LinkedList`和`ArrayDeque`。`Deque`接口扩展了`Queue`,支持双端操作,如`ArrayDeque`可以作为高效栈或队列使用。 5. `Collection...

    JAVA容器对象整理

    - `Queue`接口代表先进先出(FIFO)的数据结构,实现类如`LinkedList`或`ArrayDeque`,常用方法有`offer()`, `peek()`, 和`poll()`。 4. **Deque与ArrayList的区别** - `Deque`(双端队列)接口扩展了`Queue`,...

    面试中,经常要用到的数据结构(链表、队列、栈、二叉树、哈希表等)以及一些常用的算法

    Java提供了`Queue`接口,`LinkedList`和`ArrayDeque`都可以实现队列功能。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等。Java的`Stack`类基于`Vector`实现,也可以通过`Deque`...

    全面接触java集合框架(word版)

    - `Queue`: 用于处理先进先出(FIFO)数据结构,如 `LinkedList` 和 `ArrayDeque`。 2. **接口实现** - `ArrayList` 和 `LinkedList`: 分别实现了 `List` 接口,前者基于动态数组,后者基于双向链表。`ArrayList`...

    leetcode卡-leetcode_practices_learncard_queue_stack:我的leetcode队列和堆栈学习卡实践

    在Java8中,可以使用`java.util.Queue`接口及其实现,如`ArrayDeque`或`LinkedList`来实现队列。 堆栈则是一种后进先出(LIFO)的数据结构,它的操作主要包括压栈(push)和弹栈(pop)。在Java8中,`java.util....

    java类容器总结文档

    8. **Queue** 和 **Deque**:Queue 是队列接口,实现包括 LinkedList 和 ArrayDeque。Deque 是双端队列,支持两端的插入和删除,可用于实现栈、队列等数据结构。 9. **Collections 工具类**:Collections 提供了...

    C#集合框架全景:探索.NET中的类型宝库

    bool dequed = queue.TryDequeue(out int result); Console.WriteLine("Queue TryDequeue result: " + (dequed ? result.ToString() : "false")); bool popped = stack.TryPop(out result); Console.WriteLine(...

    stack_queue

    此外,Java的`Deque`接口也是实现栈的一种方式,例如`ArrayDeque`,它提供了更丰富的接口和更好的性能。 队列则是一种先进先出(First In, First Out,简称FIFO)的数据结构,常用于任务调度、消息传递等场景。Java...

    就业班JavaSE-day08每日作业卷答案1

    在Java中,栈可以通过ArrayDeque或Stack类实现。栈常用于表达式求值、括号匹配、递归调用等场景。 2. 队列(Queue): 队列是一种先进先出(FIFO, First In First Out)的数据结构。新元素被添加到队列的尾部,而...

    Java 基础核心总结 +经典算法大全.rar

    LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ArrayDeque PriorityQueue 反射的思想及作用 反射的基本使用 获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) ...

    Python数据结构封装类源码

    self.queue = deque() def enqueue(self, item): self.queue.append(item) def dequeue(self): if not self.is_empty(): return self.queue.popleft() else: raise Exception("Queue is empty") # 其他...

    java的集合介绍

    此外,集合框架还包括了其他接口和类,如LinkedList实现了List和Deque接口,Stack继承自Vector,用于后进先出(LIFO)操作,而ConcurrentHashMap是线程安全的HashMap实现,适用于多线程环境。 在实际开发中,选择...

    use Java, learn about Data Structures of Java.zip

    9. **队列和双端队列(Deque)**:Deque(双端队列)允许在两端进行添加和移除操作,Java的ArrayDeque类是高效的Deque实现。 10. **散列表(HashTable)**:虽然现在已较少使用,但了解HashTable仍然是必要的,它是...

    aad_datastructures:java中的列表、栈、队列实现

    此外,`Deque`接口(双端队列)也能作为栈使用,如`ArrayDeque`,它的性能通常优于`Stack`。 接下来是**队列**,队列是一种先进先出(FIFO)的数据结构,常见于任务调度、多线程通信等。Java提供了多种队列实现,如...

    14.栈和队列.pdf

    在Java中,Deque接口提供了实现双端队列的类,比如ArrayDeque(基于数组的双端队列)和LinkedList(基于链表的双端队列)。 循环队列是一种使用数组实现的队列结构,它解决了在普通队列中插入和删除操作需要移动...

    LinkedList_example:LinkedList Javascript

    LinkedList在JavaScript中常用于实现其他数据结构,如双端队列(Deque)、栈(Stack)和优先队列(Priority Queue)。此外,它在处理大量动态数据,特别是需要频繁进行插入和删除操作的场景下,比数组更高效。 4. ...

Global site tag (gtag.js) - Google Analytics