【发布时间】:2016-07-13 09:41:36
【问题描述】:
今天,当我遇到一个奇怪的问题时,我正在寻找克隆 ArrayList。
我读了this 的答案并尝试了。但是,我收到了 ArrayOutOfBounds 异常。所以我仔细研究了一下,显然 ArrayList(int size) 不起作用?
这是一个已知问题吗?
测试类:
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class ArrayListTest {
@Test
public void test() {
List<String> lista = new ArrayList<>();
lista.add("a");
List<String> listb = new ArrayList<>(lista.size());
System.out.println("Size of lista: " + lista.size());
System.out.println("Size of listb: " + listb.size());
}
}
有问题的班级:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
public class ArrayListTest2 {
@Test
public void test() {
List<String> lista = new ArrayList<>();
lista.add("a");
List<String> listb = new ArrayList<>(lista.size());
Collections.copy(listb, lista);
System.out.println("Lista: " + lista);
System.out.println("Listb: " + listb);
}
}
结果:
java.lang.IndexOutOfBoundsException:源不适合目标
在 java.util.Collections.copy(Collections.java:556)
在 ArrayListTest2.test(ArrayListTest2.java:13)
有什么想法吗?
【问题讨论】:
-
你知道,如果一个被广泛使用了 10 年的方法被破坏到根本不起作用,你不认为人们现在会发现它吗?我的意思是您不是在寻找 Java 中的错误。您应该首先查看 your 代码中的错误。再次阅读文档。尤其是构造函数
new ArrayList(size)。看到它分配内存,它不插入元素。之后大小仍然为0。 -
好的,我明白了。但是为什么副本不起作用?当然,我并不是假设我在 Java 中发现了一个错误。但我只是好奇我是否确实做出了错误的假设,或者发生了其他事情。
-
再次,您是否阅读过
copy的文档?有一部分说目标列表必须至少与源列表一样长 -
@the8472 追踪 JDK 源代码是恕我直言,对 SO 提问者提出了太多要求。事实上,我们收到了来自对完全相同的事情感到困惑的人关于
Collections.copy()的错误报告。这就是我们修复文档的原因。 -
期望人们阅读 Java SE 类的源代码不仅是不合理的,而且这样做与面向对象的开发完全相反。一个人应该遵循一个类的契约,而不是它的实现。