一.
把list往外取的动作也说一下,(有可能说的是从list中取出元素的动作)。
从list中取出所有的元素,采用iterator,因为list属于Colletion的子类,Colletion中具备的东西list也都有。(上面的截图中list只是一个空的容器,然后不断地往里面添加元素,或者删减元素)返回了iterator是怎么理解?
DOS结果没有任何问题。
list有自己特有的元素取出方式,list.get(index),输入集合中的某一个角标值,打印出来的结果就是该角标上的元素。
如果是取出所有的元素,就是如下图所示。带着角标,就和数组的操作是一样的。(list中没有写length,为什么不写length而写size?)
只有它具备这种取出方式,set不具备,set只有iterator。
现在接着取集合中的元素,换一种形式来操作,将迭代器拿来借用一下。不直接做输出动作,而是设置一个对象来接收返回的元素。
存的时候,add方法参数列表中通过多态的知识点,往里面存的任意对象都被提升被object类了。
DOS结果有两个疑问,一是为什么会有next:abc1出现,二是为什么会有异常出现?
没见过这个包,要学会去查阅API文档,去util包中的异常中,搜索ConcurrentModificationException。
什么是并发修改?这是我们开发中常出现的问题。
问题的原因是:list集合中往里面存了三个元素,存一次集合的长度就扩展一次。存了三个,长度就为三。在长度为三的集合中,我们调用了它的迭代器,Iterator it=it.iterator();这时候迭代器的值是三,换句话说,这个时候调用迭代器,迭代器只知道集合中有三个元素。迭代器就按照三个元素的方式开始了取出。在后面的判断中,集合添加了元素abc9,扩展了长度,但是迭代器不知道。迭代器迭不迭代这个元素是搞不清楚的,因为现在是迭代器在操作这些元素,而在迭代器操作的过程中,又在用集合操作这个元素(list.add("abc9"))。操作迭代器,迭代器是一个对象,集合也是一个对象,两者不是同一个东西。集合和迭代器同时在对这个元素进行修改。就会导致迭代出问题。这就是产生异常的原因。
该如何解决此异常。如果一定要在操作时,进行判断,往list集合中添加元素,那怎么修改?既然迭代和集合同时访问,造成了并发。那么,使用集合操作的时候,不迭代。使用迭代操作时,不集合,别冲突就是。在迭代操作时不用集合,那么只能用迭代操作(意思是用迭代来添加元素),反正只有两种操作方式,要么集合,要么迭代,迭代来自于集合。所以,迭代的时候,集合不能参与,迭代完了再说。但是迭代中只有三个方法,一个判断有没有,一个是获取,最后一个是删除,并没有添加的方法。
迭代器本身有局限性,迭代器下面有子接口,listIterator列表迭代器。
子接口中提供了添加的方法,修改,获取,删除,判断。怎么拿到子接口对象呢?list集合中还有一个方法没有介绍,就是ListIterator(),根据这个方法可以拿到列表迭代器。这个迭代器,只有list有(整个集合框架体系中,都有迭代器的存在)。
listIterator接口中还有一些其他的方法。
hasPrevious方法是判断前面是否有元素。
遍历完了之后,hasNext的结果是false,而hasPrevious的结果则是true。因此,这里迭代器可以往前走。
DOS结果中竖着的abc3,abc9,abc1就是hasNext的方法(不是3,2,1,是因为前面采用了set方法,改掉了0角标的元素)。