Java基础系列--09_集合2
昨天介绍了集合的主要架构体系,今天主要的目的是学习集合的迭代器的遍历和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的更多相关文章
- Java基础系列7——集合系列(1)框架概述
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...
- Java基础系列--ArrayList集合
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...
- Java基础系列--08_集合1
---恢复内容开始--- 集合当中有很多都是应用到泛型的技术,所以在讲集合之前,应该先将泛型的概念普及一下. 泛型: (1)泛型是一种类型,但是这种类型是在编译或者调用方法时才确定. (2 ...
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- Java基础系列-Collector和Collectors
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- Java基础系列-Comparable和Comparator
原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述 Java中的排序是由Comparable和Comparator这两个接 ...
随机推荐
- 001-为什么Java能这么流行
本文首发于公众号:javaadu 典型回答 这种问题比较笼统,如果我遇到这个问题,我会从下面几个点阐述我的观点: Java通过JVM实现了"一次编写,到处运行"的特性,由JVM屏蔽 ...
- string转QBytearray
最近在程序中遇到要把图片的二进制string存成图片到本地,其实就是写文件 structCameraInfo tmpCameraInfo; string strData = tmpCalibrateR ...
- IO_ADDRESS()的实现【转】
上面我们说了如何去在系统中自己实现一个设置系统寄存器的一个方法,上面归根到底要进行物理地址到虚拟地址的映射 现在我们就说说IO_ADDRESS()的实现 #define __REG32ALI(addr ...
- 第七周LINUX学习笔记
HTTP的基本操作 3月17资源子网和通信子网套接字:两类 socket:IP port IP:port Ip.port unix sock:基于文 ...
- Windows Server 2016-客户端加域准备工作
今天我们简单归总下客户端加域的先决条件或着说准备工作,方便新手或者管理员日常加域失败排错等内容,希望可以帮到大家. 一.网络准备:(保证客户端与域控解析与网络通信正常) DHCP模式:DHCP已指定域 ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- 简单读!zookeeper单机模式的启动逻辑
zk用处如此之多,以至于每个地方都要你理解zk原理! 请按如下操作姿势打开: 1. 打开zk的git仓库地址:https://github.com/apache/zookeeper , 确认过眼神,它 ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 使用.Net Core+IView+Vue集成上传图片功能
最近的项目里有上传图片的功能,当然这个功能在项目里是必须要有的,那么目前这个项目是使用完全的前后端分离,在选择文件上传的组件中还是选择了全面支持Vue的IView,任何上传图片都是通过HTTP请求,服 ...
- 中国.NET:各地微软技术俱乐部汇总(更新中...)
与微软技术的发展历程相似,微软俱乐部的发展同样经历着沉沉浮浮.2002年周庆麒先生创办的著名Office技术论坛Excel Home的上线,各种线上技术社区在中国的互联网世界中萌发.接着以鞠海洋(广州 ...