业务作用域
1、用于map集合put值后又存放进list集合时 获取第一条数据就会不一致

假设:
1、定义一个map集合
Map<String,List> map = new HashMap();

2、往map集合put值
list+i为动态变量

if(monthlyReport.getFillingDateList().size()>0){
            for (int i = 0;i < monthlyReport.getFillingDateList().size();i++){
                //查询周报此日期所有数据集
                map.put("list" + i,weeklyReportMapper.selectWeeklyReportByFillingDateList(monthlyReport.getFillingDateList().get(i)));
            }
        }

3、将map集合放进list集合中

weeklyReportList.addAll(value.stream().filter(item -> tProjectInfos.getId().equals(item.getProjectId())).collect(Collectors.toList()));

那么此时集合里的数据就是put的顺序,如果有业务是根据下表获取第一条或者最后一条时,那么数据就会出错

解决方案:

//1、获取迭代器
ListIterator<WeeklyReport> weeklyReportListIterator = weeklyReportList.listIterator();
					//判断当前指向的位置后有没有元素
                    while (weeklyReportListIterator.hasNext()) {
                        //如果有获取当前指向位置的元素
                        weeklyReportListIterator.next();
                    }
                    //逆向循环list集合
                    //这时游标已定位到集合结尾处,判断游标位置前面是否有元素
                    while
                    (weeklyReportListIterator.hasPrevious()){
                        WeeklyReport previous = weeklyReportListIterator.previous();
                        //如果有元素,就获取到前面的元素并放置在创建的集合中
                        weeklyReportListN.add(previous);
                    }

ListIterator迭代器包含的方法有:

add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false hasPrevious() :
如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
next():返回列表中ListIterator指向位置后面的元素 nextIndex()
:返回列表中ListIterator所需位置后面元素的索引 previous() : 返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引 set(E
e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e

相同点:

都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

不同点:

1).使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2).ListIterator有add方法,可以向List中添加对象,而Iterator不能。

3).istIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。

4).ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

5).都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。