第16章 List集合的总结和遍历
第16章 List集合的总结和遍历
1.重构设计
根据Vector类,ArrayList类,和LinkedList类所具有的存储特点以及拥有的方法入手,发现共性往上抽取。
共同特点:
1.允许元素重复
2.会记录先后添加的顺序po
根据他们的特点,我们可以指定规范:
遵循该规范的实现类,无论底层算法如何,都必须保证允许元素重复和保证添加先后顺序,我们给该规范起名字:List
在java中规范我们使用接口来表示。即List接口
List接口:
1.元素允许重复
2.记录添加顺序

实现接口的三个类
LinkedList类:
实现:栈,单向队列,双向队列,双向链表
Vector类
数组结构
ArrayList类
数组结构
List实现类特点和性能分析:
三种共同特点:上面两点
不同点:
Vector:底层采用数组方法结构算法,方法都使用了synchronized修饰,线程安全,但是性能相对于ArrayList较低。
ArrayList:底层采用数组结构算法,方法没有使用synchronized修饰,线程部安全,性能相对于Vector较高。
ArrayList现在已经取代了Vector的江湖地位,建议以后不要使用Vector,直接使用ArrayList。
为了保证ArrayList的线程安全,LinkedList list = Collections.synchronizedList(new ArrayList(……));
LinkedList:底层采用双向链表数据结构算法,方法没有使用synchroized修饰,线程部安全
数据结构算法和双向链表结构算法的性能问题:
数据结构算法:插入和删除算法速度低,查询和更改较快
链表结构算法:插入和删除操作速度快,查询和更改较慢
使用的选择:
Vector类打死不用!即使要用选ArrayList类
如果删除和插入操作频繁,应该选择LinkedList类
如果查询操作频繁,应该使用ArrayList类
在实际开发中使用ArrayList较多,具体根据需求环境来确定
面向接口编程:
接口类型 变量 = new 实现类();
List list = new ArrayList();
2.集合的迭代操作
集合都是可以迭代的,具体操作方法有四种:
集合的迭代
把集合中的元素一个一个的遍历取出来
遍历的四种遍历方法
for方法
for-each方法
Iterator方法
Enumeration方法
迭代器对象
Iterator:迭代器对象,只能从上往下迭代
boolea hasNext():判断当前指针后是否有下一个元素
Object next():获取指针的下一个元素,并且移动指针
LisIterator:是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代
Enumeration():古老的迭代器对象,现在已经被Iterator取代了,适用于古老的Vector类
import java.util.*;
/**
* 测试遍历集合的四种方法
*/
public class TestIterator {
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
//方式1:for循环
for (int index = 0; index < list.size(); index++){
Object ele = list.get(index);//取出指定索引位置的元素
// System.out.println(ele);//A B C D
}
//方法2:for-each增强循环
//语法:
/*
for(类型 变量 : 数组名/Iterable的实例){
//TODO
}
*/
for (Object ele : list){
// System.out.println(ele);//A B C D
}
//方法3.1使用迭代器while方法
Iterator it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());//A B C D
}
//方法3.2使用迭代器for方法
//注意for中的语法,两个分好,两个语句
for (Iterator it2 = list.iterator(); it2.hasNext();){
System.out.println(it2.next());//A B C D
}
//方法4.枚举法:古老的迭代对象
Vector v = new Vector();
v.add("A");
v.add("B");
v.add("C");
v.add("D");
Enumeration en = v.elements();
while (en.hasMoreElements()){
Object ele = en.nextElement();
System.out.println(ele);//A B C D
}
}
}
深入分析for-each和迭代器
1.for-each可以操作数组,底层依然采用for循环+索引来获取数组元素
2.for-each可以操作Iterable实例:底层其实采用的是Iterator
迭代的同时删除元素
在迭代集合的时候,边迭代边删除,是非常常用的操作:
当迭代到指定元素时,不能使用集合对象的remove()删除方法,这样会报并发修改异常,
在Collection接口中存在删除指定元素的方法,boolean remove(Object ele);但是该方法只能从集合中删除元素,不能把迭代器中指定的元素也删除
正确的方法
应该使用Iterator中的remove()方法
该方法会从两个线程中同时移除被删除的元素,保证了两个线程的同步
第16章 List集合的总结和遍历的更多相关文章
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
- Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件
Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...
- 《Python学习手册 第五版》 -第16章 函数基础
前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...
- C++ primer plus读书笔记——第16章 string类和标准模板库
第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...
- ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配
第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...
- LPTHW 笨方法学习python 16章
根据16章的内容作了一些扩展. 比如,判断文件如果存在,就在文件后追加,如不存在则创建. 同时借鉴了shell命令中类似 cat <<EOF > test的方法,提示用户输入一个结尾 ...
- 《深入Java虚拟机学习笔记》- 第16章 控制流
<深入Java虚拟机学习笔记>- 第16章 控制流
- JavaSE学习总结第16天_集合框架2
16.01 ArrayList存储字符串并遍历 ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高 ArrayList类是List 接口的大小可变数组的实现.实现了所 ...
- 第16章 观察者模式(Oberver Pattern)
原文 第16章 观察者模式(Oberver Pattern) 观察者模式 概述: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依 ...
随机推荐
- mssql 跨库获取mysql
exec sp_addlinkedserver @server='MYSQL', --这是链接服务器的名称 @srvproduct='mysql', --这个你自己随便吧 @provider='MSD ...
- Null value was assigned to a property of primitive type setter of
在SSH项目的开发中遇到了下面的错误: 检查后发现数据库和映射文件中这个字段是允许为空的,为什么还要出错呢?原来是因为这个字段是int的,int是基本类型,即使设置成可以为空也不能取空值. 解决的办法 ...
- Linux-安装Oracle(CentOS-Oracle 12c)
第一步:网络连接,在我的上一篇博客中有介绍,不再多说. 网络连接的目的:为了能使用yum命令,在网上直接下载文件. 第二步:前往oracle官网下载12c database服务器端的两个文件:(安装在 ...
- python基础之条件控制与循环
Python3 条件控制 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户 ...
- 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...
- FIS3的简单使用
序言: 最近在收集前端的优化工具,随便一搜,厉害了word哥,有grunt.gulp.FIS3.webpack等等,简直就是眼花缭乱!前辈们对于他们的评价各有千秋,于是乎就想每个都来用一遍(之前已经倒 ...
- PHP预定义变量
* PHP预定义 * 预定义变量 * $_GET - 接收客户端以请求类型为GET方法发送的数据内容 * $_POST - 接收客户端以请求类型为POST方法发送的数据内容 * $_REQUEST - ...
- 你的USB设备还安全吗?USB的安全性已从根本上被打破!
前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...
- SharePoint 2013 工作流设计之Designer 使用“可视化视图”
SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是类似Visio的设计视图(需要Visio 2013支持),下面我们简单介绍下,在可视化视图下,使用工 ...
- AngularJS在IE8的支持
AngularJS一般不会选择IE8支持, 因为很多特性在IE8下效果很差, 性能也不好, 但是由于项目的需要, 客户的机器有些是XP, 只能够装IE8, 所以为了解决这个, 我查阅了相关的资料,发现 ...