昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和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. wep api 运行周期

    1 程序集解析 2.HttpController类型的解析 3.HttpController 的选择 4.HttpController的创建 二,web api的承载宿主,iis selfhost.O ...

  2. nginx 安装、启动、重启、关闭 (linux系统命令行)

    前言: 最近在部署我的hexo静态博客到腾讯云服务器上,用到了很多nginx的知识,在此做下总结: 刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 1.卸载 y ...

  3. 广州 office365的开发者训练营交流活动简报

    2018年10月13日,在 微软广州办公室(广州市天河区太古汇1座28层微软广州办公室) 成功举办了office365的开发者训练营,本活动在微软官网的地址: https://www.microsof ...

  4. ReactiveSwift源码解析(二) Bag容器的代码实现

    今天博客我接着上篇博客的内容来,上篇博客我们详细的看了ReactiveSwift中的Observer已经Event的代码实现.接下来我们来看一下ReactiveSwift中的结构体Bag的实现.Bag ...

  5. 分布式架构原理解析,Java开发必修课

    1. 分布式术语 1.1. 异常 服务器宕机 内存错误.服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用. 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上. ...

  6. kubernetes 存储卷

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

  7. 【朝花夕拾】四大组件之(二)Service篇

    一.Service是什么 对于这个问题,想必大家都能说出一二,如“它是四大组件之一”.“在后台处理一些操作”等.咱们这里看看官方文档中的描述,官方语言一般都是准确且言简意赅的,这里可以体验一下其风格. ...

  8. Netty源码 服务端的启动

    最近一直在看netty,看完之后就想做点笔记.可是实在是太忙了,挤了还要几个晚上终于挤出来了 上图是服务端的实例代码.大致的流程先梳理一遍. 首先会执行 用于创建两个线程组,boosGroup用于接受 ...

  9. 深入理解Linux内核 学习笔记(3)

    第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...

  10. 开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有

      先看整体效果 把简单的东西“傻瓜化”是软件开发追求的目标之一.请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码.这酸爽. ...