首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ArrayList的几个问题

关于ArrayList的几个问题
EN

Stack Overflow用户
提问于 2012-11-10 18:04:42
回答 4查看 186关注 0票数 5

Question1:

指定ArrayList的大小有意义吗?我知道我的单子里会有多少个元素,在手边指定大小好吗?还是根本不重要。

代码语言:javascript
复制
List<String> list = new ArrayList<String>(1);
list.add("Hello");

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

Question2:

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

Question3

有人能告诉我如何锁定名单吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-10 18:07:41

  1. 如果您要添加很多项,这很重要,因为这意味着集合在执行过程中不需要继续复制其内部缓冲区。用一小张单子就不会有多大的区别。请注意,您没有指定ArrayList的大小-您指定的是它的初始容量: List = new ArrayList(10000);System.out.println(list.size());// 0 您仍然需要向其添加项以更改大小--但在它需要执行内部复制之前,您可以将项添加到它的容量范围内。
  2. 不,不需要额外的线程。这只意味着您在迭代集合时已经修改了它。它可以很容易地放在一个线程中: 对于(字符串项:项){ items.add("Foo");//下一个迭代步骤将失败。}
  3. 你需要提供更多的上下文。通常,在对列表执行某些操作时获得锁更有意义。
票数 8
EN

Stack Overflow用户

发布于 2012-11-10 18:07:30

  1. 如果列表很大,那么声明初始大小是值得的。为什么?因为当您创建一个ArrayList时,它的初始大小通常是10。当您添加新项而初始大小还不够时,ArrayList就会分配更多的内存,所有的元素都会被重新定位,这需要时间。
  2. 不,不需要另一条线。当您在列表上迭代时,在循环主体中添加或删除它的元素时,可能会出现此异常。然后您必须使用迭代器。
  3. 锁定名单是什么意思?您希望使其线程安全,还是禁用添加/删除其元素?在第二种情况下,您希望在unmodifiableCollection中使用java.util.Collections方法。
票数 1
EN

Stack Overflow用户

发布于 2012-11-10 18:17:38

Q1:这就是ArrayList的样子

代码语言:javascript
复制
public ArrayList{
    private int[] elementData;
    private int size;
}

在构造ArrayList时,将自动初始化数组的大小。当您用完空间时,大小会自动调整到原来大小的1.5倍。

Q2:你说得对。“例如,通常不允许一个线程修改一个集合,而另一个线程则在它上迭代。一般来说,在这种情况下迭代的结果是没有定义的。一些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会在检测到此行为时抛出这个异常。这样做的迭代器被称为失败--快速迭代器,因为它们很快地、干净地失败了,而不是在未来的一个未定时间冒着任意的、非决定性的行为的风险。”-java http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ConcurrentModificationException.html文档。

Q3:要锁定您使用的列表

代码语言:javascript
复制
Collections.unmodifiableList(list);

这适用于所有集合,并禁止用户更改数据。换句话说,它给用户一个“只读”副本。您可以在这里阅读更多有关集合类的内容。http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13324654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档