集合类的相关总结(一)

Iterator类

对 collection 进行迭代的迭代器

  • 提供的方法:

  • hasNext() 如果仍有元素可以迭代,则返回 true。

  • next() 返回迭代的下一个元素。

  • remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

  • 代码示例:


    图片.png

特别注意:

  • next()方法和remove()方法不能出现在同一个代码块里,不然会使集合变得不确定。
  • remove()方法虽然可以直接移除点集合中的元素,但是如果如要用迭代器遍历删除之后的集合元素,必须重新使用.iterator() 再重新获取迭代器实例,不能用删除时的迭代器对象。
  • 如果不用迭代器对集合进行循环遍历,是不能直接在循环中对集合进行增删操作的。

Collection类

该类是层次结构中的根接口,继承超级接口Iterable<E>类。此接口不提供任何直接实现,提供具体的子接口实现:如List和Set;


  • Collection类提供的方法,这些方法适用于它的所有子类。
  • add(E e) 添加一个元素,如果添加失败则返回false;
  • addAll(Collection(? extends E) c) 添加一个集合,这里如果被添加的集合中的某些元素已经在要填加的集合里了,则不会重复添加。
  • clear() 清除所有元素;
  • contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
  • containsAll(Collection(? extends E) c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
  • equals(Object o) 比较此 collection 与指定对象是否相等。
  • isEmpty() 判断集合是否为空,是返回true;
  • iterator() 返回一个迭代器。
  • remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
  • removeAll(Collection(? extends E) c) 移除两个集合中都包含的元素。
  • retainAll(Collection(? extends E) c) 因保存两个集合都包含的元素。
  • size() 返回集合的元素数量。
  • toArray() 返回包含此 collection 中所有元素的数组。

List类

  • 特点:

  • 有序、可重复,可以精准的控制每一个元素的位置。

  • 索引的下标是从0开始的

  • 特殊的迭代器 ListIterator 允许元素插入和替换,以及双向访问,可以从指定位置获取迭代器。

  • 在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。

  • 提供的方法:

  • add(E e) 在列表的尾部添加一个元素

  • add(int index, E e) 在列表的指定位置添加一个元素

  • addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。

  • addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置。

  • get(int index) 获得列表指定位置上的元素

  • indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

  • lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

  • listIterator() 返回此列表元素的列表迭代器(按适当顺序)。

  • listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

  • remove(Object o)从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。

  • set(int index, E e) 用指定元素替换列表中指定位置的元素(可选操作)。

  • subList(int fromIndex, int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间数据组成的集合。
    以上就是List类添加的或者相比Collection类的方法加了特殊限定的方法,有些和Collection类相同的方法,这里就没有列出来!

ListIterator<E>类

列表迭代器(继承 Iterator类),允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。

  • 提供的方法:
  • add(E e) 将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。
  • hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true。
  • hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
  • nextIndex() 返回对 next 的后续调用所返回元素的索引
  • previousIndex() 返回对 previous 的后续调用所返回元素的索引。
  • next() 返回列表中的下一个元素。
  • previous() 返回列表中的前一个元素。
  • remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
  • set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
代码效果展示:
  • 正向迭代:


    图片.png
  • 反向迭代:


    QQ截图20170427193335.png

特别说明:

  • 参照 Iterator类 的特别说明。
  • 集合本身没有数据,那么hasNext()返回为false。
  • ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置。
  • 反向迭代获取迭代器的方式实在指定位置反向获取迭代器,所以获取的迭代器里的元素就是0,1,2,3,4集合中的前一半元素,正向则相反;
  • 如果采取指定位置的方式获取迭代器,那么之后就一定要同样采取位置方式获取迭代器,不能再使用.listIterator()的方式获取;
  • 如果要进行反向迭代,必须要采用listIterator(int index)的方式获取迭代器,其实这样做是为了将迭代器的下标移到指定位置,因为默认的迭代器的位置是在列表元素的前一个位置“-1”,如果不指定迭代器的下标,那么hasPrevious()返回一定是false,也就无法通过hasPrevious()进行遍历
  • 错误写法集:
  • 不能再循环next()方法或previous()不能和add()、remove()、set()方法共存。


    图片.png
  • 不能再循环中一直进行删除操作:


    错误写法

    错误原因

    正确写法:避免在最后一个next 后调用remove()方法
  • 不能再循环中一直进行添加操作,不然会造成内存溢出!


    错误写法

    正确写法
  • 在一个迭代器循环里,set()方法、add()方法、remove()方法不能共存。


    错误写法

ArrayList<E>

  • 特点:
  • 底层存储数据采用的是数组的形式,但是数组的大小是可变的,但是变化的细节并没有别指定,可以添加空值。
  • 实现了List<E>接口,并且提供了一些可以操控自身存储数据列表的数组的大小的方法。
  • 此类实现不是同步的,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改)可以在创建的时候用Collections.synchronizedList方法将对象“包装起来”。

List list = Collections.synchronizedList(new ArrayList(...));

  • 提供的方法:
  • 构造方法:
  • ArrayList() 构造一个初始化容量为10的空列表
  • ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,
  • ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
  • 方法摘要:List接口提供的方法同样适,这里就不重复列出
    • clone() 返回此 ArrayList 实例的浅表副本。返回类型是Object类型
    • ensureCapacity(int minCapacity) 增加列表实例的数量大小。
    • removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
    • trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。

LinkedList<E>类

  • 特点:
  • List接口的链接列表的实现,允许null元素。
  • 为列表的结构操作提供了很多的操作方法,方便插入删除操作!
  • 此类实现不是同步的,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改)可以在创建的时候用Collections.synchronizedList方法将对象“包装起来”。

List list = Collections.synchronizedList(new ArrayList(...));

  • 方法:

  • 构造方法:

  • LinkedList() 构造一个空的列表

  • LinkedList() 构造一个包含指定 collection 中的元素的列表。

  • 方法摘要:

  • addFirst(E e) 在列表的头部插入指定元素

  • addLast(E e) 在列表的结尾插入指定的元素

  • clone() 返回此 ArrayList 实例的浅表副本。返回类型是Object类型

  • descendingIterator() 返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。

  • element() 获取但不移除此列表的头(第一个元素)。

  • getFrist() 返回此列表的第一个元素。

  • getLast() 返回此列表的最后一个元素。

  • listIterator() 返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

  • offer(E e) 将指定元素添加到此列表的结尾

  • offerFirst(E e) 在此列表的开头插入指定的元素。

  • offerLast(E e) 在此列表末尾插入指定的元素。

  • peek() 获取但不移除此列表的头(第一个元素)。

  • peekFirst() 获取但不移除列表的第一个元素,如果列表为空,则返回null;

  • peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

  • poll() 获取并移除列表的第一个元素

  • pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。

  • pollLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

  • pop()从此列表所表示的堆栈处弹出一个元素。等同于removeFirst(),如果列表为空则抛出异常。

  • push(E e) 将元素推入此列表所表示的堆栈。等同于addFirst(E e)

  • remove() 获取并移除此列表的头(第一个元素)。

  • removeFirst() 移除并返回此列表的第一个元素。

  • removeFirstOccurrence(Object o) 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。

  • removeLast() 移除并返回此列表的最后一个元素。

  • removeLastOccurrence(Object o) 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。

  • 代码实例:


    简单方法

ArrayList和LinkedList的区别:

Type | Get | Iteration |Insert |Remove
----|------|----
ArrayList | 110 | 490 |3790 |8730
LinkedList | 1980 | 220 |110 |110
从上表中可以看到ArrayList善于访问数据,不善于插入和删除,而LinkedList恰恰相反;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 869评论 0 1
  • 写在前面自开始在公司实习以来,经常都要用到集合框架。不仅后台要用,在前台做数据交互的时候用得也多。所以我想着是时候...
    EakonZhao阅读 3,257评论 0 12
  • 上一篇我们说完了List类和其一些常用的子实现类,这篇我们说下Set类和其常用的子实现类;集合类的相关总结(一) ...
    MLLWF阅读 314评论 0 2
  • 这几天网路上热闹异常,关于“成都司机频繁变道惹怒男司机,遭遇当街暴打至骨折”的消息被炒得沸沸扬扬。是非曲直,众说纷...
    岑飞君阅读 5,138评论 20 13
  • 123图书馆馆长MPDQ “0”该活动与本工作无关 “1”该活动只占本工作的一小部分且重要程度不高 “2”有两项活...
    倾城故阅读 224评论 0 0