Java队列循环遍历异常及获取队列最后一个值的方法咨询
问题解决:队列遍历不完整 + 获取队列最后一个元素
一、队列遍历未处理完所有元素的原因及修复
你的代码中循环提前终止的核心原因是:循环条件x <= q.size()依赖动态变化的队列大小。每次调用q.remove()都会让队列大小减1,导致循环提前结束:
- 初始队列size=3,x=0时满足条件,处理第一个元素后size变为2;
- x=1时满足条件,处理第二个元素后size变为1;
- x=2时,
2 <= 1不成立,循环直接终止,第三个元素未被处理。
修复方案(三种可选)
方案1:提前保存初始队列大小
先把队列初始长度存起来,循环次数固定为初始大小,避免动态变化的影响:
Queue<String> q = bi.getStringQueue(); int initialSize = q.size(); System.out.println("QUEUE SIZE : " + initialSize); for(int x = 0; x < initialSize; x++){ int queueBatchNumber = Integer.valueOf(q.peek()); System.out.println("Attempting auto post on AR batch " + queueBatchNumber); setReadyToPostAR(queueBatchNumber); autoPostAR(queueBatchNumber); System.out.println("Auto post on AR batch " + queueBatchNumber + " complete"); q.remove(); }
方案2:用while循环判断队列是否为空(推荐)
直接以队列是否为空作为循环条件,逻辑更直观,也能处理循环中队列被修改的情况:
Queue<String> q = bi.getStringQueue(); System.out.println("QUEUE SIZE : " + q.size()); while(!q.isEmpty()){ int queueBatchNumber = Integer.valueOf(q.peek()); System.out.println("Attempting auto post on AR batch " + queueBatchNumber); setReadyToPostAR(queueBatchNumber); autoPostAR(queueBatchNumber); System.out.println("Auto post on AR batch " + queueBatchNumber + " complete"); q.remove(); }
方案3:使用迭代器(更安全的修改方式)
用队列的迭代器遍历,调用迭代器的remove()方法,避免并发修改异常:
Queue<String> q = bi.getStringQueue(); System.out.println("QUEUE SIZE : " + q.size()); Iterator<String> iterator = q.iterator(); while(iterator.hasNext()){ String batchStr = iterator.next(); int queueBatchNumber = Integer.valueOf(batchStr); System.out.println("Attempting auto post on AR batch " + queueBatchNumber); setReadyToPostAR(queueBatchNumber); autoPostAR(queueBatchNumber); System.out.println("Auto post on AR batch " + queueBatchNumber + " complete"); iterator.remove(); }
二、获取队列最后一个元素的方法
Java的Queue接口本身没有提供直接获取尾部元素的方法(队列设计为FIFO,默认不支持随机访问尾部),具体实现取决于队列的实际类型:
1. 若队列是LinkedList/Deque实现
LinkedList和ArrayDeque都实现了Deque接口,可直接调用getLast():
// 假设队列是LinkedList LinkedList<String> linkedQueue = (LinkedList<String>) q; String lastElement = linkedQueue.getLast(); // 或者通用Deque转换 Deque<String> deque = (Deque<String>) q; String lastElement = deque.getLast();
注意:转换前要确认队列的实际实现类,否则会抛出ClassCastException。
2. 通用方法(适用于所有Queue实现)
如果不确定队列类型,可通过遍历获取最后一个元素(不会修改队列):
String lastElement = null; for(String element : q){ lastElement = element; } // 遍历结束后,lastElement即为队列最后一个元素
内容的提问来源于stack exchange,提问作者Simile Mhlanga
相关产品推荐
相关产品推荐

