ListIterator接口继承自Iterator接口,新增了add()等方法。

关于ListIterator的add()方法的作用(接口是没有方法实现的,但其实现类对于add()方法的实现机制大致相同,姑且这样说吧),《java核心技术 卷I》里如下表述:

“如果多次调用add方法,将按照提供的次序把元素添加到链表中。它们被依次添加到迭代器当前位置之前。”

对于这种说法,很容易引发歧义,当前位置是什么?当前指向的元素,还是游标位置?

带着这种疑问,我查阅了ListIterator接口的API说明文档(网址见本文结尾),得到对于add()方法的如下英文描述:

Inserts the specified element into the list (optional operation). The element is inserted immediately before the element that would be returned bynext(), if any, and after the element that would be returned by previous(), if any. (If the list contains no elements, the new element becomes the sole element on the list.)

该描述就很清晰:的确是把新元素插入由next()所返回的那个元素之前,previous()所返回的元素之后。之所以加之前与之后两个限定,是为了应对在链尾(next返回为空)以及链头(previous返回为空)的特殊情况,如果链表为空,则新插入的元素就作为该链表的唯一元素。另外,每当插入一个元素以后,迭代器都会后移(向着链尾方向)一位。

举例说明:

List<String> name=new LinkedList<String>();
name.add("A");
name.add("B");
name.add("C");
ListIterator<String> iter = name.listIterator();
iter.next();
iter.add("D");
iter.add("E");
for(String nm:name)
System.out.println(nm);

第4行代码执行完毕,name链表内容如下1A2B3C4(数字只作为占位符,可以忽略,内容为ABC,从链头到链尾)

第5行定义迭代器以后,初始迭代器的位置是在数字1,执行第6行next以后,迭代器指向数字2的位置,此时如果再执行next(),返回B,执行previous(),返回A,因此应把D插入AB之间,迭代器顺移到DB之间;依次类推,可以插入E。最终输出结果为:

A
D
E
B
C

下面再简单看一下remove方法,关于remove方法,API文档描述如下:

Removes from the list the last element that was returned bynext() orprevious() (optional operation). This call can only be made once per call to next orprevious. It can be made only ifadd(java.lang.Object) has not been called after the last call to next or previous.

简单解释一下,要执行remove,首先要找到所需移除的元素,怎样找?当然是通过next()跟previous()方法,所以remove必须要跟在next()或是previous()之后,而且只能执行一次(一个元素当然只能删一次,删多个元素,需要再执行next()或previous())。另外,在执行next()或previous()后还不能先执行了 add()方法。因为,否则add()方法执行以后,迭代器已经移动了,这样所要删除的目标元素指向不明,会报”Unknown Source“异常。

所以《java核心技术 卷I》对add和remove方法总结如下:add方法只依赖迭代器的位置(next和previous各返回什么元素),而remove方法依赖于迭代器的状态(是否执行了next或remove方法)。(红色是我的备注)

对于java API文档,推荐GrepCode,网址如下:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/ListIterator.java?av=h#ListIterator

这里你能看到类或接口的继承以及实现结构,同时还能查看实现源码,很不错。

[置顶] 有关ListIterator接口的add与remove方法探究的更多相关文章

  1. [转]有关ListIterator接口的add与remove方法探究

    原文地址: http://www.java123.net/v/492971.html 应用案例: http://820199753.iteye.com/blog/2230032 ListIterato ...

  2. 为什么Java里的Arrays.asList不能用add和remove方法?

    在平时的开发过程中,我们知道能够将一个Array的对象转化为List.这种操作,我们仅仅要採用Arrays.asList这种方法即可了.笔者前段时间一直用这种方法,有一天,我发现通过Arrays.as ...

  3. List 重载添加-add,删除-remove方法,以及获取子集方法

    package seday12; import java.util.ArrayList;import java.util.List; /*** @author xingsir* List重载了一对ad ...

  4. [置顶] Java WebService接口生成和调用 图文详解

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  5. [置顶] 【VB.NET2010】注册表写入方法

    这里,以添加启动项为例: Imports Microsoft.Win32 Imports System.Reflection.Assembly   Private Sub SetAuto_Click( ...

  6. [置顶] 遇到难题(bug)的解决方法心得

    今天早上花了2个小时解决一个问题...界面抖动.. 最近把淄博项目的界面用BT改了,后来发现4个界面之间切换会抖动.. 就是整个界面会左右抖动... 文章出处: PHP攻城师 www.phpgcs.c ...

  7. HEXO添加置顶功能

    使用库:参考 http://wangwlj.com/2018/01/09/blog_pin_post/ 目前已经有修改后支持置顶的仓库,可以直接用以下命令安装.(cmd 到博客根目录,nmp运行) $ ...

  8. Arrays.asList 为什么不能 add 或者 remove 而 ArrayList 可以

    分析如下例子: 1 import java.util.Arrays; 2 import java.util.List; 3 4 5 public class Test { 6 public stati ...

  9. 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException

    Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...

随机推荐

  1. QT:窗口最小化时显示一个小浮标

    有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思 ...

  2. VMware网络模式介绍(下篇)

    VMware网络模式介绍 VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式). Bridged 模式: 在桥接模式下,VMwa ...

  3. (译)linux系统关于命令echo的15个例子

    15 Practical Examples of ‘echo’ command in Linux By Avishek Kumar Under: Linux Commands On: August 2 ...

  4. Framework7功能齐全的 iOS7 App 前端框架

    Framework7 是一个功能很全的 HTML 框架,用来构建 iOS7 应用程序. Framework7 允许您灵活搭建列表视图(表视图) .你可以让他们作为导航菜单,你可以在列表里面使用图标,输 ...

  5. error: undefined reference to `XXX::XXX(type1, ypte2)

    moc_fortunethread.cpp:100: error: undefined reference to `FortuneThread::GetToParentThread(QString, ...

  6. JQuery(二)——简单动画效果

    上一篇博客总结了JQuery的一些基本知识,这篇博客重点从JQuery能够制造各种各样的网页效果方面来进行总结.总结一些常见的常用的基本效果的必备方法.从隐藏显示,淡入淡出,滑动,动画等几个方面来简单 ...

  7. sqlserver高版本到低版本迁移

    从SqlServer2014 备份bak文件,在SqlServer2012中还原时遇到版本不兼容的问题. 经过leader 指导,可尝试以下办法处理数据迁移.共分三个步骤: 一.对需要迁移数据库生成s ...

  8. jQuery ZeroClipboard中Flash定位不准确的解决方案

    转自波斯马,原文地址<jQuery ZeroClipboard中Flash定位不准确的解决方案> jQuery ZeroClipboard支持在多种浏览器中复制内容到剪贴板,IE.Fire ...

  9. Linux 重定向

    Linux 标准文件描述符 描述符  缩写 描述 0  STDIN  标准输入 1  STDOUT  标准输出 2  STDERR  标准错误 3-9    应该是扩展的标准输出(待验证) 命令行重定 ...

  10. KZ--NSString、NSMutableString

            //NSString初始化的几种方法(3种方法)         //1.         NSString *str2 = [[NSString alloc] init];      ...