【发布时间】:2018-10-17 02:39:43
【问题描述】:
我创建了一个基本上只是测试近似值的代码。 ArrayLists 的运行时。但是,如果一行代码被移动点,代码将无法编译。这是编译的代码。
public class ArrayTest {
public static void main(String []args) {
ArrayListTest();
}
private static void ArrayListTest() {
//initializes random variable, accumulator and iterator and ArrayList
Random rand = new Random();
Float accum = 0F;
ArrayList<Float> al = new ArrayList<>();
//finds time of program pre-running
long startTime = System.currentTimeMillis();
//Populates ArrayList
for (int i = 0; i < 20000000; i++) al.add(rand.nextFloat());
//finds time of program post-running
long endTime = System.currentTimeMillis();
//Iterates through ArrayList, summing elements
Iterator<Float> itr = al.iterator();
while(itr.hasNext()) {
accum += itr.next();
}
//Finds time of summing ArrayList
long sumEndTime = System.currentTimeMillis() - endTime;
//Prints meaningful conclusion
System.out.print("ArrayList takes: " + (endTime - startTime) / 1000.0 + " seconds to initialize.\n");
System.out.print("ArrayList takes: " + (sumEndTime / 1000.0) + " second to sum. \n");
}
}
但是,如果移动“Iterator itr = al.iterator();”在数组列表声明之后,它不会编译。这是为什么呢?
【问题讨论】:
-
"到代码的开头..." -- 代码的开头在哪里到底是什么?
-
显然
Iterator itr = al.iterator();行必须放在之后ArrayList<Float> al = new ArrayList<>();,在您创建了数组列表之后。这只是常识,不是吗?否则没有意义。 -
你不能创建迭代器 before 你已经向 ArrayList 添加了一些东西(不使用迭代器本身),否则它会失效,虽然这不会导致编译错误。
-
???你的代码应该仍然编译——你确定这是发生的,编译器不允许你创建一个类文件吗?在我看来,它可以正常编译并运行,但运行时会引发异常。
-
我会说 90% 的问题 cmet 是要求清晰的问题,如果我们似乎在吹毛求疵,很抱歉,但编程语言编译器是死板和无情的,因此程序员也必须学会这样做.好吧,也许不是“无情”,只是有点强迫症,是的。
标签: java compilation iterator