JAVA-初步认识-常用对象API(集合框架-ListIterator接口)

一.

把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角标的元素)。

原文地址:https://www.cnblogs.com/wsw-bk/p/8150429.html