昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和List的特有功能。

迭代器:
     概述:由于多种集合的数据结构不同,所以存储方式不同,取出方式也不同。但是他们都是有判断和获取这两个行为,因而将迭代器抽象成一个接口。要想利用迭代器遍历集合,只要该集合内部实现这个接口即可。
     以ArrayList集合为例的源码解析:

 public interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
public abstract void remove();
} public interface Collection{
//查看源码发现各种方法都没有实现,找他的下一级子类
public abstract Iterator iterator();
} public interface List extends Collection{
//各种方法都没有实现,找他的下一级子类
...
} public class ArrayList implements List{
//各种方法都得到了实现
... public Iterator iterator(){
return new Itr();
} private class Itr implements Iterator{
26   //size是ArrayList的元素个数
int cursor; // 返回下一个元素的索引
public boolean hasNext(){return cursor != size;}
public Object next(){...}
}
31 }

 迭代器的并发修改异常:

 // 创建集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
//创建集合的迭代器
Iterator it = list.iterator();
//使用迭代器判断是否存在下一个元素
while (it.hasNext()) {
String s = (String) it.next();
//如果存在"hello"这个字符串就增加一个"helloWorld"字符串
if ("hello".equals(s)) {
//通过集合去添加元素
list.add("helloWorld");
}
}

在这里报了一个java.util.ConcurrentModificationException异常
    发生异常的原因:当我们在使用迭代器遍历集合,而迭代器的hasNext()就像一个游标一样会一次一次的往下一个元素移动。而当我们通过集合去添加新元素时,迭代器并不知道我们添加了新元素。所以就会报出并发修改异常。用一句话概述就是“用迭代器遍历集合,用集合去操作集合”
 解决方案:从并发修改异常产生的原因去看,有两个解决方案
  方案一:使用迭代器遍历集合,使用迭代器修改集合(但是不建议)
  方案二:使用for循环去遍历集合,并使用集合本身修改集合

     // 完全通过集合实现
// for (int x = 0; x < list.size(); x++) {
// String s = (String) list.get(x);
// if ("hello".equals(s)) {
// list.add("IOS");
// }
// }
// System.out.println("list:"+list);
// System.out.println("-----------"); // 完全通过迭代器遍历并修改集合,ListIterator是Iterator的子类
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String) lit.next();
if ("hello".equals(s)) {
lit.add("IOS");
}
}
System.out.println("list:" + list);

List
前面已经说过List的特点:1.有序(存储和取出的顺序一致);2.可以重复;3.可以通过索引值操作对应位置的元素
  List的特有功能

 1、添加功能
void add(int index,Object obj): 在列表的指定位置插入指定元素
2、删除功能
Object remove(int index): 移除列表中指定位置的元素
3、修改功能
Object set(int index,Object obj): 用指定元素替换列表中指定位置的元素
4、获取功能
Object get(int index): 返回列表中指定位置的元素。
int indexOf(Object obj): 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
ListIterator listIterator():返回按适当顺序在列表的元素上进行迭代的迭代器。
5、截取功能
List subList(int fromIndex, int toIndex):截取集合。

 List的三个常用子类
  ArrayList:底层的数据结构是数组,查询速度块,增删慢;线程不安全,效率高。
  Vector: 底层数据结构是数组,查询速度快,增删慢;线程安全,效率低。
  LinkedList:底层数据结构是链表,查询速度慢,增删快;线程不安全,效率高。

 一般来说我们也需要根据自己的需求来重写equals方法,重写的主要分为三个步骤
  
1. 判断是否为同一个对象
   2.判断是否为该的对象
   3.向下转型,然后根据需求比较成员变量

Java基础系列--09_集合2的更多相关文章

  1. Java基础系列7——集合系列(1)框架概述

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...

  2. Java基础系列--ArrayList集合

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...

  3. Java基础系列--08_集合1

    ---恢复内容开始--- 集合当中有很多都是应用到泛型的技术,所以在讲集合之前,应该先将泛型的概念普及一下. 泛型:    (1)泛型是一种类型,但是这种类型是在编译或者调用方法时才确定.    (2 ...

  4. Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

    概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...

  5. Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

    概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...

  6. Java基础系列-ArrayList

    原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...

  7. Java基础系列-Collector和Collectors

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...

  8. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  9. Java基础系列-Comparable和Comparator

    原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述         Java中的排序是由Comparable和Comparator这两个接 ...

随机推荐

  1. Sentry快速开始并集成钉钉群机器人

    Sentry(直译为:哨兵)是一个开源错误跟踪服务,帮助开发人员实时监控和修复崩溃 Sentry本质上是一种帮助您实时监控和修复崩溃的服务 1.  安装客户端SDK 这里我们安装Java平台的SDK, ...

  2. DataPipeline在大数据平台的数据流实践

    文 | 吕鹏 DataPipeline架构师 进入大数据时代,实时作业有着越来越重要的地位.本文将从以下几个部分进行讲解DataPipeline在大数据平台的实时数据流实践. 一.企业级数据面临的主要 ...

  3. C 实现自己构建的数组

    #include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>stru ...

  4. iOS可视化动态绘制八种排序过程(Swift版)

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  5. 引入外部 CDN失效时--怎么加载本地资源文件(本文以jquery为例)

    相信大家都使用过CDN静态资源库,比如下面 CDN官方静态资源库:https://cdnjs.com/ 七牛前端公开库:http://staticfile.org   (vue,react,nl都有) ...

  6. 【神经网络篇】--基于数据集cifa10的经典模型实例

    一.前述 本文分享一篇基于数据集cifa10的经典模型架构和代码. 二.代码 import tensorflow as tf import numpy as np import math import ...

  7. kubernetes 存储卷

    kubernetes 存储卷    数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...

  8. Litepal【开源数据库ORM框架】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 好用的数据库框架. 效果图 代码分析 本篇主要是整理Litepal的引入和增删改查的简单操作,具体使用请阅读参考资料. 使用步骤 一 ...

  9. java~springboot~gradle里的docker集成

    在springboot里,我们的task任务可以添加docker构建的功能,在gradle集成环境里,直接可以实现编译,测试,打包镜像的流水线作业,很是方便! 下面分享给大家,在gradle里添加do ...

  10. DotNetCore跨平台~2.0提前发布喽

    回到目录 提前1个多月把2.0发布出来了,小微真的把持不住了,哈哈! windows上安装 http://mp.weixin.qq.com/s/ueJdhaBBCHga0sQlVD6YiQ https ...