需要同时迭代和修改arraylist(或类似)

时间:2017-06-03 09:07:32

标签: java arraylist

我需要迭代一个同时在别处修改的列表,我用ArrayList读取它是不可能的。

有没有人知道我可以使用什么?或者如果可能的话?我认为做阵列复制将会减慢我的需求,但如果没有其他选择,我会调查一下。无论如何,希望另一个提示:)

代码

Iterator<blabla> haha = bytes.iterator();
while(haha.hasNext()) {
  blabla aStorage = haha.next();
  TimeUnit.MILLISECONDS.sleep(120); 
}

和其他地方

bytes.add(aStorage);

1 个答案:

答案 0 :(得分:1)

我会将评论移到答案中。

  

查看您的代码,看起来您想要一个队列,而不是列表。也许ConcurrentLinkedQueue有帮助?

以下是Queue如何工作的一个非常简单的示例:

private final static Queue<String> myQueue = new ConcurrentLinkedQueue<>();

public static void main(String[] args) {

    new Thread(new Adder()).start();
    new Thread(new Consumer()).start();
}

private static class Adder implements Runnable {

    @Override
    public void run() {
        while (true) {
            myQueue.add(String.valueOf(System.currentTimeMillis()));
            try {
                TimeUnit.MILLISECONDS.sleep(1_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

private static class Consumer implements Runnable {

    @Override
    public void run() {

        while (true) {
            for (String value = myQueue.poll(); value != null; value = myQueue.poll()) {
                System.out.println(value);
            }
        }
    }
}

查看The Javadoc for the Queue Interface并查看Official Collections Trail,这是一个非常好的来源,可以根据需要找到合适的抽象数据类型。了解更多收藏而不是列表总是好的。

我定期使用的一些收藏品:

  • List(ArrayList,LinkedList)
  • 设置(HashSet,TreeSet)
  • 地图(HashMap)
  • 队列(LinkedList,ConcurrentLinkedQueue)