关于ArrayList的几个问题

the*_*ava 5 java arraylist

问题1:

指定ArrayList的大小是否有意义.我知道我的列表中将包含多少元素,是否可以预先指定大小或者甚至不重要.

List<String> list = new ArrayList<String>(1);
list.add("Hello");

List<String> newList = new ArrayList<String>();
newList.add("Hello");
Run Code Online (Sandbox Code Playgroud)

问题2:

在迭代同一集合时操作(添加,删除)集合时会发生java.util.ConcurrentModificationException. Does that mean there is a thread which is modifying the ArrayList and another Thread iterating the same object.

问题3

谁能告诉我如何锁定列表?

Jon*_*eet 8

  1. 如果你要添加很多项目,这很重要,因为这意味着集合不需要继续复制其内部缓冲区.有一个小清单,它不会有太大的区别.请注意,你不指定大小的的ArrayList-你指定的初始容量:

    List<String> list = new ArrayList<String>(10000);
    System.out.println(list.size()); // 0
    
    Run Code Online (Sandbox Code Playgroud)

    您仍然需要向其添加项目以更改大小 - 但您可以在需要在内部执行复制之前添加项目的容量.

  2. 不,不必涉及额外的线程.它只是意味着您在迭代时修改了集合.这很容易在一个线程中:

    for (String item : items) {
        items.add("Foo"); // The next iteration step will fail.
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你需要提供更多背景信息.通常,在列表上执行某些操作时获取锁定更有意义.