Java 中的 ArrayBlockingQueue iterator() 方法
在Java中常常使用队列(Queue)来解决先进先出(FIFO)的问题,其中ArrayBlockingQueue是一种基于数组实现的阻塞队列。这里就来探讨一下ArrayBlockingQueue中iterator()方法的使用。
ArrayBlockingQueue
ArrayBlockingQueue是Java中实现阻塞队列的一种方式,它将元素存储在固定大小的数组中,新元素插入到队列的尾部,而队列头部的元素会被移除。ArrayBlockingQueue可以实现公平或非公平的访问策略,为消费者和生产者提供线程安全的访问。在使用ArrayBlockingQueue时,如果队列满了,插入操作将会被阻塞;如果队列为空,取出操作也会被阻塞。
ArrayBlockingQueue iterator() 方法
ArrayBlockingQueue中的iterator()方法返回迭代器,可以用来遍历该集合中的元素。因为ArrayBlockingQueue是一个阻塞队列,所以在使用迭代器时需要保证队列中不断有元素被插入或被消费。
下面是一个使用ArrayBlockingQueue iterator()方法的示例代码:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.Iterator;
public class Example {
public static void main(String[] args) {
// 创建一个 ArrayBlockingQueue 队列
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);
// 添加元素
queue.add(1);
queue.add(2);
queue.add(3);
// 使用迭代器遍历元素
Iterator<Integer> it = queue.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
上述示例中创建了一个大小为3的ArrayBlockingQueue队列,并添加了三个元素。然后使用iterator()方法获取迭代器,并使用while循环遍历输出队列中的元素。最终输出结果为:
1
2
3
当然,如果此时有消费者从队列取出元素,那么迭代器就会对队列进行访问失败,抛出ConcurrentModificationException异常。
Iterator 元素操作
迭代器中有三个元素操作方法,分别是remove、next和hasNext:
- remove()方法:从迭代器指向的集合中删除迭代器最后一次返回的元素。如果在调用该方法之前调用了迭代器的next()方法,那么在删除元素之前必须已经调用了next()方法。
示例代码:
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; public class Example { public static void main(String[] args) { // 创建一个 ArrayBlockingQueue 队列 ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3); // 添加元素 queue.add(1); queue.add(2); queue.add(3); // 使用迭代器遍历元素,并删除指定元素 Iterator<Integer> it = queue.iterator(); while(it.hasNext()) { Integer i = it.next(); if(i == 1) { it.remove(); } } System.out.println(queue); } }
上述示例中使用迭代器遍历队列中的元素,若该元素等于1则将其删除。删除后用System.out.println(queue)来输出队列元素,结果为:
“`bash
[2, 3]
“`
- next()方法:返回迭代器指向的集合中的下一个元素。
示例代码:
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; public class Example { public static void main(String[] args) { // 创建一个 ArrayBlockingQueue 队列 ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3); // 添加元素 queue.add(1); queue.add(2); queue.add(3); // 使用迭代器遍历元素 Iterator<Integer> it = queue.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
上述示例中使用迭代器遍历队列中的元素,并使用System.out.println方法输出每个元素的值,输出结果为:
“`bash
1
2
3
“`
- hasNext()方法:判断迭代器指向的集合中是否还有元素。
示例代码:
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; public class Example { public static void main(String[] args) { // 创建一个 ArrayBlockingQueue 队列 ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3); // 添加元素 queue.add(1); queue.add(2); queue.add(3); // 使用迭代器遍历元素,并输出结果 Iterator<Integer> it = queue.iterator(); while(it.hasNext()) { System.out.println(it.next()); } // 判断队列是否为空 System.out.println("队列是否为空:" + it.hasNext()); } }
上述示例中使用迭代器遍历队列中的元素,并使用System.out.println方法输出每个元素的值。在遍历结束后使用it.hasNext()方法判断队列是否为空,并输出结果为:
“`bash
1
2
3
队列是否为空:false
“`
结论
在Java中,ArrayBlockingQueue是一种基于数组实现的阻塞队列,它可以实现消费者和生产者之间的线程安全访问。通过使用ArrayBlockingQueue的iterator()方法,可以获取迭代器来遍历队列中的元素。在使用迭代器时需要注意队列中不断有元素被插入或被消费。迭代器中包含三个元素操作方法:remove、next和hasNext,这些方法可以用来删除、获取和判断迭代器指向的集合中的元素。