1. List使用for循环remove元素,结果不正确问题:
for (int i = 0; i < list1.size(); i++) {
if (list1.get(i).contains("cdef")) {
list1.remove(i);
}
}
答:因为List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素就没有被读取到;
解决:
a) for循环,反过来遍历;
for (int i = list1.size() - 1; i >= 0; i--) {
if (list1.get(i).contains("cdef")) {
list1.remove(i);
}
}
b) 在remove方法后,执行i--;
for (int i = 0; i < list1.size(); i++) {
if (list1.get(i).contains("cdef")) {
list1.remove(i);
i--;
}
}
c) 使用Iterator代替;
for (Iterator<String> iterator = list1.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.contains("cdef")) {
iterator.remove();
}
}
2. System.currentTimeMillis和System.nanoTime方法
a) System.currentTimeMillis返回当前的时间,精确到毫秒级别,粒度为15ms~16ms(取决于OS类型);
b) System.nanoTime无法返回当前的时间,但两次连续的nanoTime差值可用于计算时间差,精确到纳秒级别,粒度为1000~2000纳秒;
c) 如果要获得高精度的时间值,推荐用JNI,可以利用Windows系统提供的函数来计时;
long start = System.currentTimeMillis();
...
long end = System.currentTimeMillis();
System.out.println(end - start);
start = System.nanoTime();
...
end = System.nanoTime();
System.out.println((end - start)/1000000L);