list的遍历没有map快,而且还不方便存取,没有key。所以可以转换成map先:
public void initMarkInfo() {
List<MarkingAreaPojo> list = this.getService().getMarkAreaInfo(null,
null, null, null, null, null, null, null, null, null, null);
if (null != list) {
for (int i = 0; i < list.size(); i++) {
MarkingAreaPojo pojo = list.get(i);
markInfoMap.put(pojo.getMarkAreaCode(), pojo);
}
}
}
//具体的说法忘记了,下次要及时记录。
//for循环的基本方式,最快,但是有线程安全啊,你必须先计算出length
public void testFunction(){
for (int i = 0; i < array.length; i++) {
//todo
}
}
//foreach方式遍历和Iterator方式本质上是一样的,代码简洁,可以防止off-by-one问题,链式存储推荐。
public void testFunction(){
if (null != markInfoMap) {
//通过Map.entrySet遍历key和value,推荐,尤其是容量大时
for (Map.Entry<String, Object> entry : markInfoMap.entrySet()) {
MarkingAreaPojo pojo = (MarkingAreaPojo) entry.getValue();
//pojo = this.checkStatus(pojo);
if (null != pojo) {
markInfoMap.put(entry.getKey(), pojo);
}
}
}
}
使用foreach循环来迭代访问Collection集合里的元素更加简洁,这就是foreach循环带来的优势。与使用Iterator接口迭代访问集合元素类似地是,foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此,在foreach循环中修改迭代变量的值也没有任何实际意义。
对List的遍历有三种方式
第一种:
- for(Iterator<A> it = list.iterator(); it.hasNext();) {
- ......
- }
这种方式在循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在循环过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出并发访问的错误.
- for(A a : list) {
- ......
- }
第三种:
- for(int i = 0; i < list.size(); i++) {
- A a = list.get(i);
- ......
- }
PS:简单说的,off-by-one error就是在说数组越界(我的理解),它包含两种情况。就像例子中的for循环,它定义了一个大小为5的数组,如国我们误将判断条件 i < 5 写成了 i <= 5,那么就会触发一个错误,这就是 off-by-one error。还有一种情况是我们将 i 初始化为 1,同样是一个 off-by-one error。