List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
注意,此实现不是同步的。
如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList
方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:
List list = Collections.synchronizedList(new LinkedList(...));
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException
。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。
双端队列
堆栈
从 Queue 接口继承的方法完全等效于 Deque 方法,
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 操作以摊销的固定时间运行。异常包括remove
、removeFirstOccurrence
、removeLastOccurrence
、contains
、iterator.remove()
以及批量操作,它们均以线性时间运行。此类的 iterator 方法返回的迭代器是快速失败 的:如果在创建迭代器后的任意时间通过除迭代器本身remove 方法之外的任何其他方式修改了双端队列,则迭代器通常将抛出 ConcurrentModificationException
。因此,面对并发修改,迭代器很快就会完全失败,而不是冒着在将来不确定的时刻任意发生不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测 bug。
此类及其迭代器实现 Collection
和 Iterator
接口的所有可选 方法。
分享到:
相关推荐
ArrayDeque实现了Deque接口,LinkedList实现了Deque,List接口 (1)对比: ArrayDeque 为数组结构,插入元素不能为null,无法确定数据量时,后期扩容会影响效率 LinkedList 链表结构,插入元素不能为null,无法确定...
`LinkedList`类实现了`Deque`接口,这个接口包含了堆栈和队列的操作,因此我们可以通过它来实现堆栈功能。例如,我们可以使用`push()`方法添加元素到堆栈顶部,`pop()`方法移除并返回顶部元素,以及`peek()`方法查看...
5. **栈(Stack)**:Java的Deque接口和ArrayDeque类可以用来实现后进先出(LIFO)的栈操作。 6. **链表**:LinkedList类实现了List接口,通过节点链接实现,插入和删除操作高效。 7. **队列**:LinkedList也可以...
Java中的LinkedList实现了Deque(双端队列)接口,可以作为Queue使用。Queue接口定义了enqueue(add())、dequeue(remove())等方法,而PriorityQueue则提供了一个根据元素自然排序或自定义比较器进行排序的队列。 ...
4. `Queue`和`Deque`:`Queue`接口表示先进先出(FIFO)的数据结构,常用的实现有`LinkedList`和`ArrayDeque`。`Deque`接口扩展了`Queue`,支持双端操作,如`ArrayDeque`可以作为高效栈或队列使用。 5. `Collection...
- `Queue`接口代表先进先出(FIFO)的数据结构,实现类如`LinkedList`或`ArrayDeque`,常用方法有`offer()`, `peek()`, 和`poll()`。 4. **Deque与ArrayList的区别** - `Deque`(双端队列)接口扩展了`Queue`,...
Java提供了`Queue`接口,`LinkedList`和`ArrayDeque`都可以实现队列功能。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等。Java的`Stack`类基于`Vector`实现,也可以通过`Deque`...
- `Queue`: 用于处理先进先出(FIFO)数据结构,如 `LinkedList` 和 `ArrayDeque`。 2. **接口实现** - `ArrayList` 和 `LinkedList`: 分别实现了 `List` 接口,前者基于动态数组,后者基于双向链表。`ArrayList`...
在Java8中,可以使用`java.util.Queue`接口及其实现,如`ArrayDeque`或`LinkedList`来实现队列。 堆栈则是一种后进先出(LIFO)的数据结构,它的操作主要包括压栈(push)和弹栈(pop)。在Java8中,`java.util....
8. **Queue** 和 **Deque**:Queue 是队列接口,实现包括 LinkedList 和 ArrayDeque。Deque 是双端队列,支持两端的插入和删除,可用于实现栈、队列等数据结构。 9. **Collections 工具类**:Collections 提供了...
bool dequed = queue.TryDequeue(out int result); Console.WriteLine("Queue TryDequeue result: " + (dequed ? result.ToString() : "false")); bool popped = stack.TryPop(out result); Console.WriteLine(...
此外,Java的`Deque`接口也是实现栈的一种方式,例如`ArrayDeque`,它提供了更丰富的接口和更好的性能。 队列则是一种先进先出(First In, First Out,简称FIFO)的数据结构,常用于任务调度、消息传递等场景。Java...
在Java中,栈可以通过ArrayDeque或Stack类实现。栈常用于表达式求值、括号匹配、递归调用等场景。 2. 队列(Queue): 队列是一种先进先出(FIFO, First In First Out)的数据结构。新元素被添加到队列的尾部,而...
LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ArrayDeque PriorityQueue 反射的思想及作用 反射的基本使用 获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) ...
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") # 其他...
此外,集合框架还包括了其他接口和类,如LinkedList实现了List和Deque接口,Stack继承自Vector,用于后进先出(LIFO)操作,而ConcurrentHashMap是线程安全的HashMap实现,适用于多线程环境。 在实际开发中,选择...
9. **队列和双端队列(Deque)**:Deque(双端队列)允许在两端进行添加和移除操作,Java的ArrayDeque类是高效的Deque实现。 10. **散列表(HashTable)**:虽然现在已较少使用,但了解HashTable仍然是必要的,它是...
此外,`Deque`接口(双端队列)也能作为栈使用,如`ArrayDeque`,它的性能通常优于`Stack`。 接下来是**队列**,队列是一种先进先出(FIFO)的数据结构,常见于任务调度、多线程通信等。Java提供了多种队列实现,如...
在Java中,Deque接口提供了实现双端队列的类,比如ArrayDeque(基于数组的双端队列)和LinkedList(基于链表的双端队列)。 循环队列是一种使用数组实现的队列结构,它解决了在普通队列中插入和删除操作需要移动...
LinkedList在JavaScript中常用于实现其他数据结构,如双端队列(Deque)、栈(Stack)和优先队列(Priority Queue)。此外,它在处理大量动态数据,特别是需要频繁进行插入和删除操作的场景下,比数组更高效。 4. ...