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

时间: 2024-08-24 10:32:33

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

JAVA-初步认识-常用对象API(集合框架-迭代器使用)

一. 我们完善完集合框架顶层接口Collection中常见方法学习以后,准备把存储在Collection集合中的元素给它取出来,因为存的目的就是为了方便取出来使用元素.这个取得动作,Colection给我们提供了一个迭代器的方法(迭代器是一个专业术语,意为取出集合中元素的方式). 取出元素的方式是个方法完成的,现在来演示一下. new谁不重要,只要能new就可以(Collection接口的子类很多,挑选一个创建对象). 调用集合的迭代器方法,返回集合中的迭代器对象,那么返回的这个对象是什么类型?

JAVA-初步认识-常用对象API(集合框架-List常用子类的特点)

一. 凡是虚线框都是接口,我们真正在使用的时候,用的是接口中的子类, List接口中,有一堆子类,是我们开发中常用的容器.ArrayList,LinkList,Vecter这三个算是开发中比较常用的. (list下面有三个常用的对象) 具体的容器必须明确其特点,那么你才知道什么时候该用这容器. 1. vector 容器之所以能够进行区分,是因为容器的内部的数据结构不一样,现在vector内部用的就是一个数组.数组本身就是一种存储数据的方式,本身就是一种结构.这种结构的特点在于,每一个元素上都带着

JAVA-初步认识-常用对象API(集合框架-体系共性功能)

一. 集合是个容器,用来存储对象的.当我们存储的对象数目变多的时候,会带来一些问题. 对象在集合里面装的时候,到底是如何进行存储的?有人说直接往里扔就是了,要注意,对于对象而言,不止集合这么一种容器. 对于对象的存储方式,每一个集合都有自己独特的定义,是根据某些需求而定的. 举例子来谈:用水杯泡茶,必须有过滤网,不然喝茶会有茶叶,如果只是喝白开水那么就不需要过滤网. 这说明容器自身都有其特定的结构,这种结构我们称之为数据结构,容器里面存储的就是数据. 数据到底按照什么样的方式来进行存放呢?我们称

JAVA-初步认识-常用对象API(集合框架-Map集合常见子类对象)

一. 说完了map集合,顺便说些小东西. map集合常用的子类: hashtable研究的就是数据结构,哈希在1.0就出来了,那是还没有table.当时,单列集合只有vector,双列集合就是hashtable.内部结构就是哈希表.是同步的.hashmap和hashtable有区别么,效率高低不再多说.下图是hashmap的API注解,是不同步的. hashtable,它不支持空键和空值.面试的时候它们之间的区别. 上面截图的体系和一个集合体系很像,就是set集合,hashset和treeset

JAVA-初步认识-常用对象API(集合框架-重点方法entryset演示图解)

一. 对于上一节的操作而言,这里还有另外一种做法,相对而言,有一点麻烦. 从刚才的动作,总结出一个原理.map集合没有迭代器,但是我们可以把map转换成有迭代器的集合,比如说set. 这是为什么呢?为什么不返回arrylist,这是拿所有的键,键是唯一的,所以返回的应该是set集合,保证元素的唯一性. 接下来,在API当中,还有一个方法也是返回set集合,(这里的set有什么特殊含义么?) 现在用它来完成取出所有元素的方式.keyset大家比较容易明白,里面装的都是键.但是,entryset是返

JAVA-初步认识-常用对象API(集合框架-泛型-泛型类)

一. 泛型我们了解完基本原理之后,除了在集合中用来传递参数类型外,还有其它的应用.它还能为我们提供很多设计上的便捷. 介绍一下以前和现在的定义方法,有什么不一样. 这里面为了方便于应用,搞了一个工具类,和主要的程序分开发. 对工具类的描述,现在要操作person,要用工具类对person对象进行操作,可以完成person对象的设置和获取. 这个工具类只能操作person,不能操作其它对象.如果想要其它对象,还要书写Tool1,Tool2......这样很麻烦,怎么办?(对传输进来的person对

JAVA-初步认识-常用对象API(集合框架-泛型-泛型限定-上限的体现)

一. 现在要说应用,查看一下API中的注释, 这里有一个方法addAll里面有extedns E,我们看一下这个方法什么时候用.下面这三个集合,有存储person,student,还有worker的. 再接下来演示一下这个高级应用,如果我们要去想定义一下集合的话,(描述一下集合) 这个类里面加入的元素不确定的情况下,写的是个E,明确什么类型,add方法中添加的也是什么类型.一次添加一个元素比较慢,addAll方法可以添加一堆元素, 一般情况下,就是这么写.(addAll又将mycollectio

JAVA-初步认识-常用对象API(集合框架-List集合的常用方法)

一. 现在重点学习一下List,List是Collection的子接口,那么Collection的方法,List都具备,共性方法就不讲述了. 讲述一下List中特有的方法,这些特有方法的共性就是可以对角标进行操作. (以下讲述的都是list中的方法,我觉着还是基于操作元素的角标) 1. 添加 截图中的第一个方法是父类Collection中的添加方法,第二个方法是自己特有的.给定一个角标位置,插入一个元素或者一堆元素. 上图中的方法是根据位置,拿元素.一旦有了角标,就可以精确进行定位了. 这里删除

JAVA-初步认识-常用对象API(集合框架-treeset集合-二叉树)

一. treeset集合可以对其中的元素进行排序,它有两种排序方法,现在我们想知道它底层是什么结构,它是怎么确定元素位置的?它是有原因的,而且它这种结构对于排序而言,效率很高. 一说到排序,之前说到选择冒泡.选择冒泡对于比较次数而言,比较多一些,因为是转着圈在比.对于treeset而言,有个比较好的地方就是 将例子中的元素按照年龄排序,演示一遍它是怎么存放的. 存zhangsan,28的时候,就在容器中搞了一个zhangsan,28.容器中只有一个元素,不进行比较.紧跟着再来个lisi,21,l