Java 将linkedList转换为数组列表时发生ArrayIndexOutOfBoundsException
我正在尝试将linkedList转换为ArrayList,如下所示Java 将linkedList转换为数组列表时发生ArrayIndexOutOfBoundsException,java,arraylist,linked-list,Java,Arraylist,Linked List,我正在尝试将linkedList转换为ArrayList,如下所示 private LinkedList<myData> myLinkedList= new LinkedList<myData>(); public Collection<myData> getData() { return new ArrayList<myData>(myLinkedList); } private LinkedList myLinkedLis
private LinkedList<myData> myLinkedList= new LinkedList<myData>();
public Collection<myData> getData()
{
return new ArrayList<myData>(myLinkedList);
}
private LinkedList myLinkedList=new LinkedList();
公共集合getData()
{
返回新的ArrayList(myLinkedList);
}
linkedList可能由多个线程更新。在生产中进行测试时,我得到以下错误。这个错误是不一致的。所以我知道可能是一周一次,一个月左右
java.lang.ArrayIndexOutOfBoundsException: 15
at java.util.LinkedList.toArray(LinkedList.java:866)
at java.util.ArrayList.<init>(ArrayList.java:131)
at org.xxx.yyy.zzz.getData(Data.java:291)
java.lang.ArrayIndexOutOfBoundsException:15
位于java.util.LinkedList.toArray(LinkedList.java:866)
位于java.util.ArrayList。(ArrayList.java:131)
位于org.xxx.yyy.zzz.getData(Data.java:291)
有没有可能与linkedList的并发修改有关。谢谢你在这方面的帮助 LinkedList#toArray()就是这样实现的(Oracle JDK 7)
公共对象[]toArray(){
对象[]结果=新对象[大小];
int i=0;
for(节点x=first;x!=null;x=x.next)
结果[i++]=x项;
返回结果;
}
如果在构建结果
数组之后但在for
循环之前添加到链接列表
,则当尝试访问大于原始大小的索引时,for
循环内的数组访问表达式将导致ArrayIndexOutOfBoundsException
你真的应该设置一些同步障碍,这样就不会发生这种情况。toArray
失败只是你做了一些根本危险的事情的一个症状
从:
如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改链表,则必须在外部对其进行同步
您需要添加同步(不仅仅是为了toArray
,基本上是为了列表的所有用途),或者使用一个设计为线程安全的并发集合。是的。您可能应该在实例上进行同步。或者使用fail fast版本。如果有多个线程正在修改链接列表
。。。对当它进行复制时,它分配一个数组,然后遍历列表。显然,您是在创建数组之后向列表中添加一个元素,而数组现在太小了。
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
return result;
}