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

  • 相关阅读:
    TensorFlow中的基本概念
    理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope
    深度神经网络关键词解释
    [python] os.path.join() 与 sys.path
    Git 遇到的坑
    [转] 资深程序员得到的职场经验教训
    VS CODE 快捷键
    解决VS Code使用code runner开发Python乱码问题
    熵,条件熵,互信息,交叉熵
    Visual Studio Code 支持TensorFlow配置支持
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8150429.html
Copyright © 2020-2023  润新知