第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集合的总结和遍历的更多相关文章

  1. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  2. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  3. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  4. C++ primer plus读书笔记——第16章 string类和标准模板库

    第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  6. LPTHW 笨方法学习python 16章

    根据16章的内容作了一些扩展. 比如,判断文件如果存在,就在文件后追加,如不存在则创建. 同时借鉴了shell命令中类似 cat <<EOF > test的方法,提示用户输入一个结尾 ...

  7. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

  8. JavaSE学习总结第16天_集合框架2

      16.01 ArrayList存储字符串并遍历 ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高 ArrayList类是List 接口的大小可变数组的实现.实现了所 ...

  9. 第16章 观察者模式(Oberver Pattern)

    原文  第16章 观察者模式(Oberver Pattern) 观察者模式  概述:   在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依 ...

随机推荐

  1. 应用程序启动管理 Winform版

    ★前言      开发这个小工具的想法主要是机器中安装了数据库,每次设置开机启动数据库服务的话,则系统启动很慢,每次都得手动到服务管理器中停止服务,很是繁琐,相信不少做开发的朋友会遇到同样的问题,就有 ...

  2. ASP.NET MVC搭建项目后台UI框架—7、统计报表

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...

  3. Visual Studio for Mac 简介

    2016-12-13 Hutchinson 微软中国MSDN 在 11 月举行的 Connect(); 上,Microsoft 将推出 Visual Studio for Mac 预览版.这是一个激动 ...

  4. rabbitmq trace 日志的使用以及其疑惑之处

    RabbitMQ 默认日志里只有类似客户端"accpet/close"等信息,对于有异常或者跟踪消息内部结构就比较麻烦了. 不过MQ有个rabbitmq_tracing插件,安装该 ...

  5. Netty(一)引题

    本文介绍Java BIO(同步阻塞IO),伪异步IO,NIO(非阻塞IO),AIO(异步IO)这四种IO的情况,并对不同IO模型作比较. 目录 1.BIO 2.伪异步IO 3.NIO 4.AIO 5. ...

  6. 全文检索学习历程目录结构(Lucene、ElasticSearch)

    1.目录 (1) Apache Lucene(全文检索引擎)—创建索引:http://www.cnblogs.com/hanyinglong/p/5387816.html (2) Apache Luc ...

  7. 弄一个ajax笔记方便查询-基础知识篇

    jQuery对Ajax做了大量的封装,jQuery采用了三层封装: 最底层的封装方法为:$.ajax() 通过最底层进一步封装了第二层的三种方法:.load().$.get().$.post() 最高 ...

  8. javascript中的一些核心知识点以及需要注意的地方

    前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...

  9. jsonp 演示实例 —— 基于node

    序 同源策略是浏览器处于安全考虑,为通信设置了"相同的域.相同的端口.相同的协议"这一限制.这让我们的ajax请求存在跨域无权限访问的问题. 同时我们发现script标签引入脚本的 ...

  10. 2016最新cocoapods安装流程,安装过程中遇到的问题及解决方法

    现在的cocoapods与之前比较.有很多不一样的地方.自己试了一试,终于搞定.现在大概纪录一下. 1.首先查看ruby是否是最新版的. ruby是通过rvm安装的所以需要先安装rvm后查看ruby是 ...